在没有主键的情况下 MySQL 中设置差异
Set difference in MySQL without primary key
我想在 MySQL 中做一个 EXCEPT/MINUS。如果主键可用,显而易见的解决方案是:
SELECT
*
FROM
table_a AS a
WHERE
a.ID not in(
SELECT
b.ID
FROM
table_b AS b
)
但是,如果我没有键列并且我想要一个实际的设置差异,即考虑所有(可能很多)列怎么办?
我想要类似的东西
SELECT * FROM table_a WHERE * NOT IN …
这当然不可能。我不能将整行分配给一个变量,可以吗?有什么想法吗?
您仍然可以使用 not in
:
select a.*
from table_a a
where (a.col1, a.col2, . . . ) not in (select b.col1, b.col2, . . . from table_b b);
我倾向于使用 exists
,但是:
select a.*
from table_a a
where not exists (select 1
from table_b b
where a.col1 = b.col1 and a.col2 = b.col2 and . . .
);
如果任何列具有 null
,Not exists
通常会更直观地工作。另外,您可以使用 <=>
,即 NULL
安全相等运算符。
我想在 MySQL 中做一个 EXCEPT/MINUS。如果主键可用,显而易见的解决方案是:
SELECT
*
FROM
table_a AS a
WHERE
a.ID not in(
SELECT
b.ID
FROM
table_b AS b
)
但是,如果我没有键列并且我想要一个实际的设置差异,即考虑所有(可能很多)列怎么办?
我想要类似的东西
SELECT * FROM table_a WHERE * NOT IN …
这当然不可能。我不能将整行分配给一个变量,可以吗?有什么想法吗?
您仍然可以使用 not in
:
select a.*
from table_a a
where (a.col1, a.col2, . . . ) not in (select b.col1, b.col2, . . . from table_b b);
我倾向于使用 exists
,但是:
select a.*
from table_a a
where not exists (select 1
from table_b b
where a.col1 = b.col1 and a.col2 = b.col2 and . . .
);
如果任何列具有 null
,Not exists
通常会更直观地工作。另外,您可以使用 <=>
,即 NULL
安全相等运算符。