我正在尝试弄清楚此SQL查询的作用,更具体地说是在NOT EXISTS
之后的部分开始:
SELECT
order_num,
MIN(order_date)
FROM
orders
WHERE
order_date >= '01.01.2019'
AND
NOT EXISTS
(
SELECT
NULL
FROM
result
WHERE
unique_id = '201895'
AND
result = order_num
)
GROUP BY
order_num
答案 0 :(得分:3)
SELECT NULL
仍从查询返回行。就像是一样:
[...] EXISTS( SELECT 1 FROM [...]
或
[...] EXISTS( SELECT Id FROM [...]
这只是一种清楚表明未使用该值的方法。
答案 1 :(得分:1)
EXISTS
/ NOT EXISTS
检查是否返回行。它不在乎结果是什么-甚至NULL
。我绝对不喜欢使用它。我倾向于使用1
-更容易键入和更清晰。
也就是说,查询应该使用表别名和合格的列名。这对于相关的子查询可能非常重要:
SELECT o.order_num, MIN(o.order_date)
FROM orders o
WHERE o.order_date >= DATE '2019-01-01' AND
NOT EXISTS (SELECT 1
FROM result r
WHERE r.unique_id = '201895' and
r.result = o.order_num
)
GROUP BY o.order_num;
我还固定了日期常量以使用DATE
关键字。这比依赖数据库设置更安全。
答案 2 :(得分:-1)
主查询中的WHERE
子句执行两项操作。首先,它排除了ORDER_DATE
在2019年1月1日之前的所有行。其次,在具有NOT EXISTS
条件的情况下,它排除了{{ 1}}列在另一个表ORDER_NUM
中,其中RESULT
是RESULT
。
为什么这样做,我不知道(这很可能是业务需求的一部分-它不是“编程”的一部分);但是,如果UNIQUE_ID
列的201895
表中的ORDER_NUM
表中的RESULT
表中出现RESULT
,那么您的主查询将不会返回任何行为UNIQUE_ID = 201895
。
为什么在表ORDER_NUM = 10392
(同名)中有列RESULT
(我也不知道);我发现这样的做法非常令人困惑,经常导致难以发现的错误,例如,因为无论使用什么位置,精确的单词搜索仍然会找到表名和列名。