sql - 关系划分-模仿 'ONLY IN'

标签 sql oracle relational-division

我正在尝试在 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/

相关文章:

sql - 我需要为每个单词的 SQL AND 条件使用逗号分隔的字符串

php - $post->comments()->create() 是否比 Laravel 中的 Comment::create() 更昂贵?

python - SQLAlchemy 中关系的高效查询

oracle - 尝试创建 CHECK 约束时出现 ORA-00907

java - 尝试使用 Oracle JdbcOdbcDriver 时出现 classNotFoundException

sql - 甲骨文的情况下,如果不为空?

MySql关系除法内连接语法超过3个表

sql - array_agg 包含另一个 array_agg

mysql - 比较两个 MySQL 表之间的最高值

java - 如何从一个文本字段获取值到另一个文本字段