Я пытаюсь обнаружить некоторые сломанные записи в базе данных MS-SQL.Каков самый быстрый способ определить несогласованные записи между двумя таблицами?
В упрощенном примере scenerio это:
У меня есть 2 таблицы, просто говоря:
Table_1: Id, дата, OpId
Table_2: Дата, OpId , EventName
И у меня есть это правило: если в таблице есть запись N не менее 1 строки должно существовать в таблице_2 для Table_1.Date и Table.OpId.
Если в таблице_1 есть строка, и если в таблице нет строки, соответствующей этой строке, ТОГДА есть сломанные данные - независимо от причины.
Чтобы узнать неверные данные, я использую:
SELECT *
FROM table_1 t1
LEFT JOIN table_2 t2 ON t1.Date = t2.Date AND t1.OpId = t2.OpId
WHERE t2.OpId IS NULL -- So, if there is no
-- matching row in table_2 then this is a mistake
Но это занимает слишком много времени, чтобы выполнить запрос завершен.
Может ли быть более быстрый или лучший способ приблизиться к аналогичным сценариям?
Wow! Это сработало! Почему в этом запросе гораздо быстрее? – pencilCake
ЗА ИСКЛЮЧЕНИЕМ И НЕ СУЩЕСТВУЮТ. И лучшей ссылкой является http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ – gbn
@gbn - 'EXCEPT' полезно только в том случае, если вам не нужны дополнительные столбцы из первой таблицы, поэтому «NOT EXISTS» является хорошим выбором по умолчанию. (Я сказал «лучше или равно») –