2017-01-16 7 views
0

Я хочу сделать EXCEPT/MINUS в MySQL. Если первичные ключи были доступны, очевидным решением было бы:Установить разницу в MySQL без первичного ключа

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 … 

Это не возможно, конечно. Я не могу назначить целую строку переменной, не так ли? Есть идеи?

+1

Добавить пример данных таблицы и ожидаемый результат - также форматированный текст. – jarlh

ответ

1

Вы все еще можете использовать 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 . . . 
       ); 

Not exists обычно работает более интуитивно, если какие-либо столбцы имеют null. Кроме того, вы можете использовать <=>, NULL - безопасный оператор равенства.