Mysql 根据多列选择第二个表中不存在的行
我正在使用mysql。我有两张桌子。它们不共享密钥,但有一些共同的属性。我必须从表A中选择表B中不存在的行。基于谷歌搜索和堆栈溢出,我编写了这个查询Mysql 根据多列选择第二个表中不存在的行,mysql,sql,Mysql,Sql,我正在使用mysql。我有两张桌子。它们不共享密钥,但有一些共同的属性。我必须从表A中选择表B中不存在的行。基于谷歌搜索和堆栈溢出,我编写了这个查询 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 nu
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的值为负值。假设所有键值都不为空,那么可以这样做。一个空比较就足够了:
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倾向于具体化子查询,这会增加额外的开销,并会阻止索引的使用。假设所有键值都不为空,您可以这样做。一个空比较就足够了:
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。如果列实际上包含空值,而不仅仅是可空值,那么您需要在JOI条件中考虑到这一点,可能需要使用空安全比较运算符。如果某些列可空值呢?@KnowsNotMuch。如果列实际上包含空值,而不仅仅是可空值,那么您需要在JOI条件中考虑到这一点,可能需要使用空安全比较运算符。