与SELECT NULL一起不存在

时间:2019-04-11 14:08:27

标签: sql oracle

我正在尝试弄清楚此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

3 个答案:

答案 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中,其中RESULTRESULT

为什么这样做,我不知道(这很可能是业务需求的一部分-它不是“编程”的一部分);但是,如果UNIQUE_ID列的201895表中的ORDER_NUM表中的RESULT表中出现RESULT,那么您的主查询将不会返回任何行为UNIQUE_ID = 201895

为什么在表ORDER_NUM = 10392(同名)中有列RESULT(我也不知道);我发现这样的做法非常令人困惑,经常导致难以发现的错误,例如,因为无论使用什么位置,精确的单词搜索仍然会找到表名和列名。