WITH SAMPLE (DATE_OF_USE, VENUE, ROOM_LOG, LOG_NAME, PERSON_LOG) AS
(
    SELECT DATE '2023-09-01', 'ASU', 'Red Room', 'Log 12345', 'Jane, Doe' 
    FROM DUAL 
    UNION ALL
    SELECT DATE '2023-09-01', 'ASU', 'ROOM 01', 'Log 12345', 'Jane, Doe' 
    FROM DUAL 
    UNION ALL
    SELECT DATE '2023-09-02', 'MOR', 'Blue Room', 'Log 67890', 'John, Smith'  
    FROM DUAL 
    UNION ALL
    SELECT DATE '2023-09-02', 'MOR', 'ROOM 02', 'Log 67890', 'John, Smith' 
    FROM DUAL 
    UNION ALL
    SELECT DATE '2023-09-03', 'ASU', 'ROOM 03', 'Log 11222', 'Luis, Jacob' 
    FROM DUAL 
    UNION ALL
    SELECT DATE '2023-09-04', 'MOR', 'ROOM 04', 'Log 22211', 'Patel, Hannah' 
    FROM DUAL 
    UNION ALL
    SELECT DATE '2023-09-05', 'ASU', 'Red Room', 'Log 33333', 'Sparks, Noah' 
    FROM DUAL 
    UNION ALL
    SELECT DATE '2023-09-05', 'ASU', 'ROOM 01', 'Log 33333', 'Sparks, Noah' 
    FROM DUAL
)
SELECT 
    * 
FROM 
    SAMPLE
WHERE 
    LOG_NAME IN (SELECT LOG_NAME FROM SAMPLE 
                 WHERE ROOM_LOG = 'Red Room')

输出:

 2023-09-05 00:00:00 ASU ROOM 01 Log 33333 Sparks, Noah
 2023-09-05 00:00:00 ASU Red Room Log 33333 Sparks, Noah
 2023-09-01 00:00:00 ASU ROOM 01 Log 12345 Jane, Doe
 2023-09-01 00:00:00 ASU Red Room Log 12345 Jane, Doe


SELECT 
    * 
 FROM 
    SAMPLE
 WHERE 
     LOG_NAME NOT IN (SELECT LOG_NAME FROM SAMPLE WHERE ROOM_LOG = 'Red Room')

输出:

2023-09-03 00:00:00 ASU ROOM 03 Log 11222 Luis, Jacob
2023-09-02 00:00:00 MOR ROOM 02 Log 67890 John, Smith
2023-09-02 00:00:00 MOR Blue Room Log 67890 John, Smith
2023-09-04 00:00:00 MOR ROOM 04 Log 22211 Patel, Hannah

 SELECT 
    * 
 FROM 
    SAMPLE
 WHERE 
     NOT EXISTS (SELECT LOG_NAME FROM SAMPLE WHERE ROOM_LOG = 'Red Room')

输出:

Blank

 SELECT 
    * 
 FROM 
    SAMPLE
 WHERE 
     EXISTS (SELECT LOG_NAME FROM SAMPLE WHERE ROOM_LOG = 'Red Room')

输出:

2023-09-01 00:00:00 ASU Red Room Log 12345 Jane, Doe
2023-09-01 00:00:00 ASU ROOM 01 Log 12345 Jane, Doe
2023-09-02 00:00:00 MOR Blue Room Log 67890 John, Smith
2023-09-02 00:00:00 MOR ROOM 02 Log 67890 John, Smith
2023-09-03 00:00:00 ASU ROOM 03 Log 11222 Luis, Jacob
2023-09-04 00:00:00 MOR ROOM 04 Log 22211 Patel, Hannah
2023-09-05 00:00:00 ASU Red Room Log 33333 Sparks, Noah
2023-09-05 00:00:00 ASU ROOM 01 Log 33333 Sparks, Noah

使用NOT IN返回我需要的结果,但我看到推荐使用EXISTS/NOT EXISTS而不是使用IN/NOT IN的帖子,但我不确定为什么运算符会产生不同的结果.我原以为不存在两次返回‘Log 67890’、‘Log 11222’和‘Log 22211’,但输出为空.我还期望eXist两次返回‘Log 12345’和‘Log 33333’.

我还没有看到一个帖子解释使用同一个表时的运算符(在这个例子中,只有一个表‘SAMPLE’).

在本例中,使用IN/NOT IN似乎很有效.但是,有时我会遇到这样的错误:‘ORA-00913:值太多.’

如有任何帮助,将不胜感激!

推荐答案

子查询

SELECT LOG_NAME FROM SAMPLE WHERE ROOM_LOG = 'Red Room'

返回四个值.

当您执行IN (...)时,您将只关联这四个结果-您的主要查询是查找sample中具有这四个值的四行.

当你做EXISTS (...)的时候,你并不是在相互关联.您在sample中找到了行,其中该子查询返回了any行.这是一个要么全有要么全无的决定,外层表中的每一行都有相同的答案.如果有any'Red room'行,则子查询返回一些内容,EXISTS子句的计算结果为TRUE;否则,它的计算结果为FALSE.

如果希望得到与IN相同的结果,则必须在子查询中添加相关性:

SELECT 
    * 
 FROM 
    SAMPLE s1
 WHERE 
     EXISTS (
         SELECT NULL -- can be anything as value isn't referred to elsewhere
         FROM SAMPLE s2
         WHERE ROOM_LOG = 'Red Room'
         AND s2.LOG_NAME = s1.LOG_NAME -- correlation with main query
     )

db<>fiddle

然后,加NOT也会得到与NOT IN相同的结果.

Sql相关问答推荐

具有2个共享列的两个表的Amazon RSQL合并

R中对Arrow duckdb工作流的SQL查询

SQL将 Select 查询作为新列添加到另一个 Select 查询

如何在PostgreSQL中的一列中添加两个文本?

判断序列索引处的序列是否完整

按连续相等值分组排序

从给定数据中查找下一个工作日期

如何在T-SQL中编写row_number的WHERE子句?

按行值出现的顺序对行值进行分组

Postgresql 生成器列导致语法错误

如何使用SELECT语句进行左连接,并根据右表中的特定值过滤结果?

在给定的日期范围内填写缺失的日期

使用in和and运算符过滤记录的条件

使用其他表 SUM 的交换价格转换价格并获得 AVG

如何将多行的查询结果合并为一行

在给定列中具有特定值的行与 SQL 中的总行数的比率

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法

交叉应用 OPENJSON / PIVOT - 错误的顺序

如何在 SQL Server 中参数化 Select top 'n'

当我按 PK 分组时,该表中的所有列在每个组中都具有相同的值.那么为什么 SQL Server 需要对这些列进行聚合呢?