Короткий, но SQL-запрос (T-SQL, SQL Server) - PullRequest
2 голосов
/ 17 февраля 2012

Предположим, у меня есть 2 таблицы, каждая таблица имеет N столбцов.В table1

НЕТ повторяющихся строк. И теперь мы хотим знать, какие наборы данных в table2 (включая дубликаты) также содержатся в table1.

Я пытался

select * from table1
intersect
select * from table2

Но это дает мне только уникальные строки в обеих таблицах.Но я не хочу уникальных строк, хочу видеть все строки в таблице 2, которые находятся в table1 ...

Имейте в виду!Я не могу сделать

select *
from table1 a, table b
where a.table1col = b.table2col

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

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

Пример:

create table table1 (table1col int)
create table table2 (table2col int)

insert into table1 values (8)
insert into table1 values (7)

insert into table2 values (1)
insert into table2 values (8)
insert into table2 values (7)
insert into table2 values (7)
insert into table2 values (2)
insert into table2 values (9)

Я хочу, чтобы мой запрос затем возвращал:

8
7
7

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

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

Одной из таких функций является CHECKSUM.

Возвращает значение контрольной суммы, вычисленное для строки таблицы или для список выражений. CHECKSUM предназначен для использования в строительстве хэш индексы.

Оператор SQL

SELECT  tm.*
FROM    (
          SELECT  CS = CHECKSUM(*)
          FROM    Table2
        ) tm          
        INNER JOIN (          
          SELECT  CS = CHECKSUM(*)
          FROM    Table2          
          INTERSECT
          SELECT  CHECKSUM(*)          
          FROM    Table1
        ) ti ON ti.CS = tm.CS

Обратите внимание, что CHECKSUM может привести к столкновениям. Вам придется проверить это, прежде чем делать какие-либо операции с вашими данными.

Редактировать

Если вы используете SQL Server 2005, вы можете сделать это немного более надежным, добавив HASH_BYTES.

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

0 голосов
/ 17 февраля 2012

ИСКЛЮЧИТЬ против INTERSECT - ссылка

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

INTERSECT возвращает любые отличные значениякоторые возвращаются запросом слева и справа от операнда INTERSECT.

Может быть, EXCEPT может решить вашу проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...