2014-11-05 2 views
0
SELECT DISTINCT a.value 
FROM a LEFT JOIN b 
    ON a.value = b.value 
     AND (b.field IS NULL OR b.field != 'my_string'); 

SELECT a.value 
FROM a 
WHERE a.value NOT IN 
    (SELECT value 
    FROM b 
    WHERE b.field = 'my_string'); 

Из того, что я читал, выполнение LEFT JOIN происходит быстрее. Но я также прочитал, что DISTINCT - это запах кода для неэффективного запроса. Как я могу определить, какой запрос лучше работает в худшем случае?Выбор строк не в другой таблице

EDIT: извините, id не является первичным ключом, это просто другое поле. Я заменю его на значение.

EDIT2: Похоже, что каждый человек положил трубку на мой первый запрос. Предположим, что это похоже на это. Разве логика не такая же?

SELECT DISTINCT a.value 
FROM a LEFT JOIN b ON a.value = b.value 
WHERE (b.field IS NULL OR b.field != 'my_string'); 

EDIT3: образец скрипки. http://sqlfiddle.com/#!2/500ea/1

EDIT4: Принятый ответ. http://sqlfiddle.com/#!2/500ea/8

ответ

6

Ваше первое соединение нечувствительное. Он возвращает все значения a.id в a. Помните, что left join хранит все строки в первой таблице и сопоставляет строки во втором. Я думаю, что вы собираетесь:

SELECT a.id 
FROM a LEFT JOIN 
    b 
    ON a.id = b.id AND b.field = 'my_string' 
WHERE b.field IS NULL; 

distinct должно быть ненужным, если предположить, что a.id, ну, уникальный идентификатор.

Альтернативой является использование not exists:

SELECT a.id 
FROM a 
WHERE NOT EXISTS (SELECT 1 FROM b WHERE a.id = b.id AND b.field = 'my_string'); 

Для повышения производительности, создать индекс b(id, field).

+0

ninjaed при написании такого же ответа +1 –

+0

Вы правы. Спасибо. http://sqlfiddle.com/#!2/500ea/8 – Tuan

0

В общем, NOT IN (SELECT ...) более inneficient чем LEFT JOIN, потому что SELECT в состоянии IN() должен быть выполнен один раз для каждой строки для того, чтобы выполнить фильтр. Для небольших наборов данных это не проблема, но для больших наборов данных это может быть довольно большой головной болью довольно inneficient.

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