2009-07-03 3 views
0
**Table A** 
1 
2 
3 
4 
5 
6 


**Table B** 
2 
3 
5 

Как выбрать идентификаторы записи, которые существуют только в таблице B? В этом примере, я ищу для запроса, который возвращает 1, 4 и 6.MySQL - Как получить список значений в таблице A, которых нет в таблице B?

+0

то, что эти значения? Идентификаторы? предоставление структуры таблицы на самом деле упростит нам работу –

+0

К сожалению, это идентификаторы. Я изначально предоставил больше информации, но потом я подумал, что я подойду только к соответствующим битам. Видимо, я обошел слишком далеко. – Eileen

ответ

2

Предполагая, что столбец называется 'ID', либо:

SELECT * 
FROM tableA a 
WHERE NOT EXISTS (SELECT 1 FROM tableB WHERE id = a.id) 

или

SELECT * 
FROM TableA 
WHERE id NOT IN (SELECT id FROM tableB) 

Вы, вероятно, нужно проверить, чтобы увидеть, который работает лучше всего. MySQL может быть немного непредсказуемым.

+0

А, это прекрасно! Благодаря! Производительность здесь не проблема, так как это одноразовый запрос. – Eileen

2

Попробуйте

select value from B where value not in (select value from A) 

, чтобы получить значения в B, которые не являются в А.

Чтобы получить (противоположные значения в не Б) использовать

select value from A where value not in (select value from B) 
+0

Мне было бы очень любопытно узнать, как это происходит против ответа, предоставленного cletus. Моя первоначальная мысль заключалась в том, чтобы ответить тем, что он написал, но будет ли это быстрее? Ммм. –

+0

Если таблица B может содержать значения NULL, НЕ является опасным инструментом, см. Http://stackoverflow.com/questions/129077/sql-not-in-constraint-and-null-values ​​Рассмотрите возможность использования NOT EXISTS. – Andomar

0

Это позволяет избежать IN + подзапросов:

SELECT A.value FROM A 
LEFT OUTER JOIN B ON (A.value = B.value) 
WHERE B.value IS NULL 

Поскольку IN (subquery) isn't optimized, как это выполняется для каждой найденной строки в таблице А

+0

Это зависит от оптимизатора запросов. Например, Sql Server будет выполнять оба запроса таким же образом. – Andomar

+0

Да, но вопрос в том, что касается mysql, в документе говорится, что этот запрос (по-видимому, по-видимому 6.0) запутан оптимизатором. –

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