Используя EXCEPT, где 1 = 0 - PullRequest
       47

Используя EXCEPT, где 1 = 0

0 голосов
/ 31 декабря 2018

Я увидел следующее сообщение об основном способе де-дупликации записей без объяснения того, как это работает.Я вижу, что это работает, но я хочу знать, как это работает и как оценивать.Ниже я выложу код и мои мысли.Я надеюсь, что кто-то может сказать мне, если мой мыслительный процесс о том, как это оценивается шаг за шагом, является правильным, или если я выключен, может кто-нибудь, пожалуйста, сломайте его для меня.

CREATE TABLE #DuplicateRcordTable (Col1 INT, Col2 INT)
INSERT INTO #DuplicateRcordTable
SELECT 1, 1
UNION ALL
SELECT 1, 1
UNION ALL
SELECT 1, 1
UNION ALL
SELECT 1, 2
UNION ALL
SELECT 1, 2 
UNION ALL
SELECT 1, 3
UNION ALL
SELECT 1, 4
GO

Это возвращаетбазовая таблица:

Table1

Затем этот код используется для исключения дубликатов:

SELECT col1,col2
FROM #DuplicateRcordTable
EXCEPT
SELECT col1,col2
FROM #DuplicateRcordTable WHERE 1=0

Насколько я понимаю, где 1 = 0создает временную таблицу, структурированную так же, но не имеющую данных.

Затем этот код начинает добавлять данные в новую пустую таблицу?

Например, он смотрит на первую пару Col1, Col2 из 1,1 и говорит: «Я не вижу егов таблице ", поэтому он добавляет его в таблицу" temp "и конечный результат, затем проверяет следующую строку, которая также равна 1,1, а затем видит ее уже в таблице" temp ", чтобы она не добавлялась в конечный результат ..... и так далее по данным.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Причина, по которой это работает, связана с определением EXCEPT, которое в соответствии с документацией MS равно

, ИСКЛЮЧИТЬ возвращает отдельные строки из левого входного запроса, которые не выводятся по правому краю.запрос ввода.

Ключевым словом здесь является distinct.Установка where 1 = 0 заставляет второй запрос не возвращать результатов, но сам оператор EXCEPT затем сокращает строки от левого запроса до строк, которые distinct.

Как говорит @Gordon Linoff в своем ответеСуществует более простой и простой способ сделать это.

Тот факт, что пример использует одну и ту же таблицу в левом и правом запросах, может вводить в заблуждение, следующий запрос будет выполнять то же самое, еслизначения в правом запросе не существуют слева:

SELECT col1, col2
FROM @DuplicateRecordTable
EXCEPT
SELECT -1, -1

REF: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=sql-server-2017

0 голосов
/ 31 декабря 2018

EXCEPT - это заданная операция, которая удаляет дубликаты.То есть в первой таблице берется все, что не во второй, а затем выполняется удаление дубликатов.

При пустом втором наборе остается только удаление дубликатов.

Следовательно,

SELECT col1, col2
FROM #DuplicateRcordTable
EXCEPT
SELECT col1, col2
FROM #DuplicateRcordTable
WHERE 1 = 0;

эквивалентно:

SELECT DISTINCT col1, col2
FROM #DuplicateRcordTable

Это был бы более типичный способ написания запроса.

Это также эквивалентно:

SELECT col1,col2
FROM #DuplicateRcordTable
UNION
SELECT col1,col2
FROM #DuplicateRcordTable
WHERE 1 = 0;
...