объединение удаляет строки из половины запроса, когда другая половина равна нулю - PullRequest
0 голосов
/ 31 января 2019

Может кто-нибудь объяснить, почему, если я запускаю запрос ниже, строки не добавляются правильно из верхней половины объединения?Я думал, что объединение только устраняет дубликаты, а не значения?Если я сделаю это объединение всех, это исправит это, я просто не уверен, зачем это нужно?Спасибо, ДжБ

CREATE TABLE #c3 (idNbr int, idValue int, idP int);
insert into #c3 (idNbr, idValue, idP) select 1 , 1 , 1 ;
insert into #c3 (idNbr, idValue, idP) select 1 , 1 , 1 ;
insert into #c3 (idNbr, idValue, idP) select 1 , 1 , 1 ;

CREATE TABLE #c4 (idNbr int, idValue int, idP int);
insert into #c4 (idNbr, idValue, idP) select 1 , 1 , 2 ;

select rs.idNbr, sum(rs.id1Tot)idTot, sum(rs.id2Tot) idTot2 from (
    select idNbr, idvalue id1Tot, 0 id2Tot from #c3 where idP=1
     union  
    select idNbr, 0 idTot, idvalue id2Tot from #c4 where idP=1
    )rs  group by rs.idNbr

drop table #c3
drop table #c4

1 Ответ

0 голосов
/ 01 февраля 2019

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

Другими словами, когда UNION удаляет дубликаты, ему все равно, из какой таблицы пришли строки.Результат T1 UNION T2 совпадает с T2 UNION T1.

В вашем примере первая таблица оператора UNION имеет три одинаковых строки.

1, 1, 1
1, 1, 1
1, 1, 1

Вторая таблицаоператор UNION пуст.

UNION складывает три и ноль строки вместе:

1, 1, 1
1, 1, 1
1, 1, 1

, а затем удаляет дубликаты из этого результата, оставляя только одну строку:

1, 1, 1

Затем вы вычисляете сводку по этой строке.


UNION ALL ничего не устраняет, поэтому, если вы используете UNION ALL, его результат будет три строки

1, 1, 1
1, 1, 1
1, 1, 1

, которые затем включаются в сводку.

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