在没有主键的情况下 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 安全相等运算符。