SQL UNION - 不合逻辑的结果

时间:2017-03-01 14:25:31

标签: sql sql-server select union

我在SQL中对UNION有一个有趣的问题。

我的陈述是这样的形式:

with tab as (
(select FldA, FldB From  Table1A inner join Table1B on Field1A=Field1B)
UNION
(select FldA, FldB From  Table2A inner join Table2B on Field2A=Field2B)
)
select * from tab
where FldA="XYZ"

当我运行它时,我只返回1行 - 这是不正确的。我只是通过评论UNION和第二个Select语句来验证它是不正确的:

with tab as (
(select FldA, FldB From  Table1A inner join Table1B on Field1A=Field1B)
--UNION
--(select FldA, FldB From  Table2A inner join Table2B on Field2A=Field2B)
)
select * from tab
where FldA="XYZ"

如果我运行此版本,我会返回 THREE 行!我假设我做了一些愚蠢的事 - 但我无法想象是什么。

2 个答案:

答案 0 :(得分:7)

UNION删除重复项,以防止重复使用UNION ALL

从这个意义上说,UNIONDISTINCT的作用相同。与DISTINCT一样,如果每个(选定)列的记录相同,则记录被视为重复记录。

UNION删除重复项,无论重复项发生在哪个集合中,因为DISTINCT之后执行UNION

如果您有2个查询/数据集AB,如果您UNION这些,则可以得到DISTINCT两者的组合。如果A中有重复项,则会将其删除。如果AB中存在记录,则它也会唯一返回(即,它只会在最终结果集中出现一次)。

答案 1 :(得分:3)

union从结果中删除重复项。一个常见的“问题”是它从结果中删除任何重复项,无论它们是在两个结果集之间还是在任何一个结果集中都重复。

如果您需要保留这些重复项,则可以改为使用union all