【问题标题】:How to filter SQL results when the referenced table can be empty?引用的表可以为空时如何过滤SQL结果?
【发布时间】:2022-01-04 14:08:02
【问题描述】:

我有一个从不同表中选择的查询,然后使用 WHERE 子句过滤项目。 该子句如下所示:

WHERE allItems.NumID != (SELECT RelatedNumID FROM allRelated WHERE NumID = allItems.NumID)

allRelated 表不为空时,这可以正常工作。 但是当它为空时,我从查询中得到 0 个结果。

我尝试使用NOT IN 代替!=allRelated 为空时返回结果,allRelated 不为空时不过滤结果:

WHERE allItems.NumID NOT IN (SELECT RelatedNumID FROM allRelated WHERE NumID = allItems.NumID)

我也尝试加入表格,但得到的结果与 NOT IN 相同:

LEFT JOIN allRelated ON allItems.NumID = allRelated.NumID
WHERE allRelated.NumID IS NOT NULL

我应该如何编写查询以使其同时适用于空和非空allRelated 表?

附:我正在使用 SQLite。

【问题讨论】:

    标签: sql sqlite left-join where-clause exists


    【解决方案1】:

    试试NOT EXISTS:

    WHERE NOT EXISTS (
      SELECT 1 
      FROM allRelated 
      WHERE allRelated.NumID = allItems.NumID
        AND allRelated.RelatedNumID = allItems.NumID
    ) 
    

    或者,将LEFT连接的WHERE子句中的条件更改为IS NULL

    LEFT JOIN allRelated 
    ON allItems.NumID = allRelated.NumID AND allRelated.RelatedNumID = allItems.NumID
    WHERE allRelated.NumID IS NULL
    

    【讨论】:

    • 这会在allRelated 为空时返回结果,但是当allRelated 不为空时它不会像以前那样过滤结果。
    • @user3132457 你能用小提琴中的样本数据重现你的问题吗:dbfiddle.uk/?rdbms=sqlite_3.27?
    • 我玩了一下,当我将条件更改为 WHERE allRelated.NumID = allItems.NumID 时,您建议的解决方案有效。
    • @user3132457 从什么改变?这就是我在查询中所做的。
    • 抱歉,改成这个:WHERE allRelated.NumID != allItems.NumID
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2023-02-17
    • 2022-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多