【问题标题】:Select Rows which don't exist in second table based on multiple columns根据多列选择第二个表中不存在的行
【发布时间】:2023-03-29 17:20:01
【问题描述】:

我正在使用 mysql。我有两张桌子。它们不共享密钥(但有一些共同的属性)。我必须从 tableA 中选择 tableB 中不存在的行。基于谷歌搜索和堆栈溢出,我编写了这个查询

select ta.a, ta.b, ta.c from 
(select a, b, c, -1 * c d from TableA) ta
left join TableB tb on (ta.a = tb.a and ta.b = tb.b and ta.d = tb.c) 
where tb.a is null and tb.b is null and tb.c is null;

但我不确定这是否正确。你能确认或告诉我我写的是否正确吗?

最后我不应该从 TableA 中获取任何行,如果 TableB 有一行具有相同的 a 和 b 值且 c 为负值。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    假设没有一个键值是NULL,你可以这样做。一个NULL 比较就足够了:

    select ta.a, ta.b, ta.c
    from TableA ta left join
         TableB tb
         on ta.a = tb.a and ta.b = tb.b and - ta.c = tb.c 
    where tb.a is null;
    

    我不建议使用子查询来定义d。 MySQL 倾向于具体化子查询,这会增加额外的开销并且会阻止使用索引。

    【讨论】:

    • 如果某些列可以为空怎么办?
    • @KnowsNotMuch 。 . .如果列实际上包含 NULL 值(而不仅仅是“可空”),则需要在 JOI 条件中考虑这一点,可能使用 NULL-safe 比较运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2023-04-02
    • 2017-12-17
    相关资源
    最近更新 更多