2015-12-04 2 views
2

Этот вопрос относится к оператору SQL UNIONвнутренний способ поиска повторяющихся строк - не о написании собственного запроса для сравнения двух строк.Как UNION в SQL Server сравнивает одну строку с другой?

Рассмотрите, например, я использую объединение с 2 выбранными запросами. Каждый выбор объединяет 5 или 6 таблиц и имеет 10 столбцов в результирующем наборе.

Вопрос в следующем: как UNION найти дубликаты строк? Сравнивает ли столбца1 с select1 с столбцом1 select2 & & column2 select1 с колонкой2 select2 ......?

Когда у меня есть 10 столбцов в каждом выборе - результат содержит 7000 строк (например).

Когда я есть 9 или 11 столбцов в операторе отбора (но не изменение присоединиться к/логике запроса) - результат содержит различное количество строк, а не 7000.

Может кто-нибудь объяснить, каким образом UNION определить, какие строки - это «дубликаты»?

Примечание: Я использую SQL Server 2008.

+1

Сравнение столбцов по столбцам должно быть способом. Даже в реляционной алгебре объединение в основном сравнивает кортежи из разных элементов отношений по элементу, чтобы определить, есть ли дубликаты. Смотрите это: https://www.cs.purdue.edu/homes/bertino/348Spring2012/relational_algebra_and_calculus.pdf –

+1

Английский немного шаткий :), но я уверен, что вопрос правильный. –

+0

Есть ли столбец «timestamp» в любом месте этих запросов? –

ответ

6

Согласно Pinal Dave, который имеет давний блог с большим количеством полезной информации о T-SQL,

UNION заявление эффективно делает SELECT DISTINCT в наборе результатов. Если вы знаете, что все возвращенные записи уникальны из вашего объединения, используйте вместо него UNION ALL, это дает более быстрые результаты.

SELECT DISTINCT будет сравнивать Вейлах из всех столбцов, так что если любое значение в любой колонка отличается, эта строка будет оставаться, но если все значения совпадают, то он будет удален от результатов. Существуют различные правила сравнения значений столбцов, которые имеют несколько иной тип, и вы не можете использовать столбцы, где тип столбца в одной части UNION не может быть преобразован в тип соответствующего столбца в другой части от UNION.

+0

Большое спасибо Джеймсу. Это то, что я искал :-) –

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