选择基于多列的第二个表中不存在的行

时间:2018-04-27 15:33:54

标签: mysql sql

我正在使用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的负值。

1 个答案:

答案 0 :(得分:2)

假设没有任何键值为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倾向于实现子查询,这增加了额外的开销,并且可以防止使用索引。