我正在使用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的负值。
答案 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倾向于实现子查询,这增加了额外的开销,并且可以防止使用索引。