Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据多列选择第二个表中不存在的行_Mysql_Sql - Fatal编程技术网

Mysql 根据多列选择第二个表中不存在的行

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

我正在使用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 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条件中考虑到这一点,可能需要使用空安全比较运算符。