2017-03-01 58 views
2

我在SQL中有一个有趣的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返回行 - 这是不正确的。我可以确认它不只是纠正通过评论联盟和第二个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" 

如果我运行这个版本,我得到返回行!我假设我正在做一些愚蠢的事情 - 但我无法想象会发生什么。

+1

我假设3行在第二个查询中具有相同的fldA,fldB值。在使用'union'时,它消除了重复项,结果将成为第一个查询的一行。 –

+3

如果三行具有相同的“FldA”和“FldB”值 - “UNION”消除重复,则会出现明显的问题。 –

回答

7

UNION删除重复项,保留重复项使用UNION ALL

从这个意义上说,UNION的工作原理与DISTINCT相同。与DISTINCT一样,如果每条(选定)列的记录都相同,则记录将被视为重复项。

UNION删除重复项,无论发生哪个重复项,因为DISTINCTUNION之后执行。

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

+0

优秀!谢谢,这工作完美。只要它允许我将标记为答案。我认为UNION在两个选择中都给了我所有的行,但它显然不是。 – Lefty

3

union删除结果中的重复项。一个常见的“陷阱”是,它会从结果中删除任意重复项,而不管它们是在两个结果集之间还是在任何一个结果集内重复。

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

+0

如果tableA有重复,当我用tableB'UNION'时,tableA中的重复项是否会在结果集中被删除? –

+1

谢谢 - 这个答案更完整,但我觉得我需要将HoneyBadger's标记为答案,因为它是第一个答案。 – Lefty

+1

@TomJMuthirenthi是的。这就是我想要做的。 – Mureinik