2015-05-18 2 views
1

Скажем, у меня есть 2 таблицы (tb1, tb2) как с следующей схемой:Найти записи на нескольких полях не в другой таблице

CREATE TABLE tb1 (
    col1 INT NOT NULL, 
    col2 TEXT NOT NULL, 
    col3 TEXT NOT NULL, 
    col4 REAL 
); 

Как найти записи tb1, которые не присутствуют в tb2 на столбцы col1, col2, col3?

Я исследовал по this, this и this, но пока они все находят записи только на одной колонке. Я также использовал коды/логику в этих ссылках, но в итоге вернул неверный результат с очень плохими характеристиками (45 тыс. Записей на tb1, 1,7 млн ​​записей на tb2). Я пытаюсь реализовать это на SQLite.

Если вы хотите увидеть, вот мой пример кода (с помощью соединения слева ж/где равна нулю), но не полагаться на нее:

SELECT * 
FROM tb1 
LEFT JOIN tb2 
ON 
tb1.col1 = tb2.col1 AND 
tb1.col2 = tb2.col2 AND 
tb1.col3 = tb2.col3 
WHERE 
tb2.col1 IS NULL AND 
tb2.col2 IS NULL AND 
tb2.col3 IS NULL 

ответ

5

Попробуйте NOT EXISTS вместо этого, по производительности, конечно, может зависеть от существующих индексы ...

SELECT * 
FROM tb1 
WHERE NOT EXISTS 
( 
    SELECT * 
    FROM tb2 
    WHERE 
     tb1.col1 = tb2.col1 AND 
     tb1.col2 = tb2.col2 AND 
     tb1.col3 = tb2.col3 
) 
+0

Приветствую вас за подсказку! – sober

1

Как о чем-то вроде:

SELECT * 
FROM tb1 
WHERE NOT EXISTS (SELECT * FROM tb2 
        WHERE tb1.col1 = tb2.col1 
        AND tb1.col2 = tb2.col2 
        AND tb1.col3 = tb2.col3) 
+2

точно так же, как упоминалось @dnoeth –

+3

Ха, а мой был лучше отформатирован :-))) – dnoeth

+0

@dnoeth, не больше! – jarlh

0

Hi @Dnoeth и @Sober ,

Возможно, вы столкнетесь со следующей проблемой с решением Dnoeth, сообщите мне, если вы не являетесь.

Msg 402, Level 16, State 1, Line 9 типов данных, текст и текст несовместимы в равной оператору.

примечание: я не мог опубликовать это в комментарии из-за меньшей репутации.

+0

У меня не было никаких ошибок; на самом деле, ответ @ dnoeth выполнен хорошо (с индексом). – sober

Смежные вопросы