我正在尝试在 Oracle SQL 中编写一个查询,该查询采用两个参数,并在整个表中查找仅出现 或 之一的所有实例,无论搜索中有多少个实例。这是我正在寻找的示例:
| ID | FileType | COUNT(FileType) |
|-----|----------|-----------------|
| 1 | txt | 1 |
| 1 | png | 3 |
| 1 | jpg | 2 |
====================================
| 2 | txt | 0 |
| 2 | png | 6 |
| 2 | jpg | 0 |
====================================
| 3 | txt | 0 |
| 3 | png | 0 |
| 3 | jpg | 5 |
====================================
| 4 | txt | 0 |
| 4 | png | 3 |
| 4 | jpg | 1 |
====================================
| 5 | txt | 5 |
| 5 | png | 0 |
| 5 | jpg | 3 |
我的目标是获取所有仅包含 png 或 jpg 的 ID,并忽略其余部分,因此我只希望返回 ID 2、3 和 4。
我尝试在这里查找解决方案,但没有找到任何与我的情况相符的内容。 (最接近的是这个问题:SQL select rows with only a certain value in them)
我确实发现这个问题可以通过关系划分来解决,但到目前为止我还没有任何经验。到目前为止,我的查询如下所示:
SELECT DISTINCT ID, FileType, COUNT(FileType)
FROM Table ta
WHERE (ta.FileType = 'jpg' or ta.FileType = 'png') and
NOT EXISTS
(SELECT *
FROM Table tb
WHERE ta.FileType = tb.FileType and
(tb.FileType != 'jpg' or tb.FileType != 'png'))
GROUP BY ID, FileType;
当我尝试这个时,我没有得到任何结果。有人知道我哪里出错了吗?
最佳答案
您可以使用集合运算符:
SELECT ID FROM tab WHERE FileType IN ('jpg', 'png')
MINUS
SELECT ID FROM tab WHERE FileType NOT IN ('jpg', 'png')
假设:FileType 不可为空。
处理 NULL:
SELECT ID FROM tab WHERE FileType IN ('jpg', 'png')
MINUS
SELECT ID
FROM (SELECT * FROM tab WHERE FileType IS NOT NULL)
WHERE FileType NOT IN ('jpg', 'png')
关于sql - 关系划分-模仿 'ONLY IN',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54184827/