2015-10-20 1 views
1

У меня есть два стола:Исключить записи, если правая таблица соответствует

Таблица A:

+--+----+ 
|id|name| 
+--+----+ 
|0 |foo | 
|1 |bar | 
|2 |baz | 
+-------+ 

Таблица B:

+--+----+ 
|A |cond| 
+--+----+ 
|0 |X | 
|1 |Y | 
+-------+ 

Где столбец БА A.id значение ,

Я хочу, чтобы выбрать все строки из A, где нет ни одного совпадения в B таблице при B.cond = «X».

Таким образом, результат должен быть:

  • бар
  • Баз

Как написать этот запрос SQL с присоединиться (или аналогичный метод производительности)?

ответ

2
SELECT 
    A.* 
FROM 
    A 
LEFT JOIN 
    B 
    ON A.id = B.A 
    AND B.cond = 'X' 
WHERE 
    B.A IS NULL 

Этот запрос соединяет таблицы, основанные на условиях, указанных вами, а затем выбирает только те строки, в которых нет никакого матча в таблице B.

5

Вы можете использовать NOT EXISTS

SELECT a.id, a.name 
FROM A 
WHERE NOT EXISTS 
(
    SELECT 1 FROM B 
    WHERE b.A = a.id AND b.cond = 'X' 
) 

Однако, я всегда забываю, что MySql является единственным (?) RDBMS, который имеет проблемы для оптимизации EXISTS/NOT EXISTS. Поэтому немного лучше использовать подход LEFT JOIN.

http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/

В MS SQL-Server, то лучше использовать NOT EXISTS.

http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join

+0

о выполнении вопроса, NOT EXIST меньше, лучше или равно с JOIN? – bux

+0

@ bux Почему бы не сосать его и не увидеть? – Strawberry

+0

@bux Возможно, эта статья интересна: http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/, хотя это может быть слегка устаревший. – jpw

1

В дополнение к предлагаемым решениям, используя not in будет работать тоже:

SELECT * FROM A 
WHERE ID NOT IN (SELECT A FROM B WHERE COND = 'X') 

Он должен выполнять наравне с left join и является более компактным.

+0

Я не рассматривал этот подход. Спасибо, что поделился! –

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