我在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 行!我假设我做了一些愚蠢的事 - 但我无法想象是什么。
答案 0 :(得分:7)
UNION
删除重复项,以防止重复使用UNION ALL
。
从这个意义上说,UNION
与DISTINCT
的作用相同。与DISTINCT
一样,如果每个(选定)列的记录相同,则记录被视为重复记录。
UNION
删除重复项,无论重复项发生在哪个集合中,因为DISTINCT
之后执行UNION
。
如果您有2个查询/数据集A
和B
,如果您UNION
这些,则可以得到DISTINCT
两者的组合。如果A
中有重复项,则会将其删除。如果A
和B
中存在记录,则它也会唯一返回(即,它只会在最终结果集中出现一次)。
答案 1 :(得分:3)
union
从结果中删除重复项。一个常见的“问题”是它从结果中删除任何重复项,无论它们是在两个结果集之间还是在任何一个结果集中都重复。
如果您需要保留这些重复项,则可以改为使用union all
。