ОБЪЕДИНЕНИЕ двух запросов ВЫБОРА, но результирующий набор меньше одного из них

#sql #sql-server #union

#sql #sql-сервер #объединение

Вопрос:

В инструкции SQL Server есть

 SELECT id, book, acnt, prod, category from Table1 <where clause...>
UNION
SELECT id, book, acnt, prod, category from Table2 <where clause...>
 

Первый запрос вернул 131 972 строки данных; второй — 147 692 строки. Я не заметил, что из этих двух таблиц есть какая-либо общая строка данных, поэтому я ожидаю, что результирующий набор после ОБЪЕДИНЕНИЯ должен быть таким же, как сумма 131972 147692 = 279 384.

Однако результирующий набор после ОБЪЕДИНЕНИЯ равен 133 857. Даже если они могли перекрывать строки, которые я случайно пропустил, результат должен быть, по крайней мере, таким же, как и больший результирующий набор из этих двух. Я не могу понять, откуда взялось число 133 857.

Правильно ли я понимаю SQL UNION? В этом случае я использую SQL server.

Комментарии:

1. UNION удаление дубликатов ваших данных, поэтому, если строка появляется несколько раз, она отображается только один раз. Вы хотите UNION ALL .

Ответ №1:

Чтобы расширить комментарий, приведенный под вопросом, который, я думаю, излагает то, что вы уже знаете:

UNION заботится о дубликатах также и внутри одной таблицы.

Просто взгляните на пример:

НАСТРОЙКА:

 create table tbl1 (col1 int, col2 int);
insert into tbl1 values
(1,2),
(3,4);
create table tbl2 (col1 int, col2 int);
insert into tbl1 values
(1,2),
(1,2),
(1,2),
(3,4);
 

Запрос

 select * from tbl1
union 
select * from tbl2;
 

будет производить продукцию

 col1 | col2
-----|------
1    | 2
3    | 4
 

Скрипка DB