SQL-запрос для поиска пропущенных строк между двумя связанными таблицами

У меня есть две таблицы:

Таблица АЯ БЫABC_IDVALТаблица БЯ БЫABC_IDVAL

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

Я хочу найти всеVAL значения столбца в таблице А, которыене присутствует в таблице B для того же ABC_ID.

Ответы на вопрос(1)

Решение Вопроса
SELECT A.ABC_ID, A.VAL WHERE NOT EXISTS 
   (SELECT * FROM B WHERE B.ABC_ID = A.ABC_ID AND B.VAL = A.VAL)

или же

SELECT A.ABC_ID, A.VAL WHERE VAL NOT IN 
    (SELECT VAL FROM B WHERE B.ABC_ID = A.ABC_ID)

или же

SELECT A.ABC_ID, A.VAL LEFT OUTER JOIN B 
    ON A.ABC_ID = B.ABC_ID AND A.VAL = B.VAL WHERE B.VAL IS NULL

Обратите внимание, что эти запросы не требуют, чтобы ABC_ID был в таблице B вообще. Я думаю, что делает то, что вы хотите.

 Fazal30 сент. 2010 г., 03:13
Извините ./ .. Последний запрос сработал .. Спасибо
 Larry Lustig30 сент. 2013 г., 15:40
@alphaprolix: я не знаю, с чего началась эта идея, но вам не нужно избегать * в этих обстоятельствах. Для оптимизатора запросов очевидно, что вы проверяете наличие строк, а не возвращаете данные, и список столбцов не будет использоваться.
 alphaprolix30 сент. 2013 г., 21:50
@LarryLustig: с помощью выбора 1имеет производительность невыгодна, но разница настолько мала, что люди обычно игнорируют ее.
 Remus Rusanu30 сент. 2010 г., 02:54
Объединение будет иметь побочный эффект мультипликационных записей, если в TableB имеется более одной записи с совпадающими ABC_ID и VAL
 OMG Ponies30 сент. 2010 г., 03:00
 Larry Lustig30 сент. 2013 г., 21:56
Если эта (крайне минимальная) разница в синтаксическом анализе все еще существует в SQL Server, я бы посчитал это недостатком их синтаксического анализатора. Как отмечает Celko в комментарии к статье, которую вы цитировали, большинство современных движков будут работать одинаково.
 alphaprolix30 сент. 2013 г., 07:00
В первом решении вы должны использовать 1 (или любую другую букву) вместо (*) для оптимизации запроса.
 Larry Lustig30 сент. 2010 г., 03:37
Remus, JOIN отфильтровывает совпадающие строки, поэтому только результирующие строки таблицы A, которые не совпадают в таблице B, будут участвовать в наборе результатов. Поскольку строки, которые будут отображаться, вносятся исключительно из таблицы A со стороны JOIN (через ВЛЕВО ВНЕШНИЙ), я думаю, что каждая строка будет отображаться только один раз.
 Fazal30 сент. 2010 г., 03:06
Это не работает, так как внутренний запрос возвращает вам VAL для другого ABC_ID. Например. Таблица B имеет значения 1, 123, 1; 2, 123, 2, 3, 134, 5 и таблица А имеет значения 1, 123, 1; 2123,5; В идеале я хочу получить таблицу A 2, 123, 5 для возврата

Ваш ответ на вопрос