Union возвращает две строки, если данные разные, и одну, если они одинаковые!Зачем? - PullRequest
1 голос
/ 11 января 2011

Принимая следующий оператор:

select count( 1 ) as cnt from tbl where val= 1 
union
select count( 1 ) as cnt from tbl where val = 0

Если два выбора возвращают одинаковое значение, результатом является одна строка с этим значением.Если селекторы возвращают разные значения, результатом являются две строки с двумя значениями.Почему?

Я пытаюсь найти общее количество строк, используя:

select sum (cnt) from
(
    select count( 1 ) as cnt from tbl where value = 1
    union
    select count( 1 ) as cnt from tbl where value = 0
) as tbl2

, который работает, как и ожидалось, если количество отличается, но дает половину значения, если число совпадает...

(PS: больше интересует, почему sql ведет себя так, чем в решении)

Ответы [ 2 ]

9 голосов
/ 11 января 2011

Это поведение является намеренным.Вы должны использовать UNION ALL для достижения желаемого поведения.По сути, UNION выполняет операцию объединения набора, удаляя дубликаты из набора.

http://www.fmsinc.com/free/NewTips/SQL/SQLtip5.asp

1 голос
/ 11 января 2011

главное различие между union и union all состоит в том, что union делает отличительные для всех возвращаемых полей.Где union all просто возвращается и присоединяется к различным наборам результатов

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