两次不同NR关联后执行Union操作,结果是否无重复数据?
关于Union后是否会出现重复数据的解答
嘿,这个问题问得很实在!咱们来好好捋一捋:
首先得明确UNION和UNION ALL的核心区别:
UNION:会自动对两个结果集的所有行做全列匹配去重——只要某两行的每一列值都完全相同,就会被合并成一行。UNION ALL:直接拼接两个结果集,完全不去重,性能比UNION高,但会保留所有重复行。
回到你的场景,你说“推测此处不会产生重复数据”,这个结论是否成立,取决于两种关联结果集的具体内容:
什么时候不会有重复?
如果以下两个条件同时满足:
- 你的两个关联结果集(直接join的结果、提取文本后join的结果)没有任何一行的所有列值完全相同
比如:从t2文本字段提取的NRfromText对应的t2行,和直接用NR字段join的t2行是不同的记录;或者即使NR值相同,其他业务列(比如姓名、部门)有差异,那这两行就是不同的,不会被UNION视为重复。 - 每个关联结果集内部本身没有重复行(
INNER JOIN本身如果没有多对多的匹配关系,一般不会产生重复,但如果t1或t2存在重复的NR值,可能会出现)
这种情况下,UNION之后自然不会有重复数据,甚至用UNION ALL也不会有重复。
什么时候可能出现重复?
如果存在这样的场景:
t2中有某一行,它的NR字段值,和从它的文本字段中提取出的NRfromText值完全相同,并且这一行和t1的某行NR匹配成功。这时候两种join操作可能会得到完全相同的一行(所有列值都一样),这时候UNION会自动把这两行合并成一行,最终结果里不会有重复;但如果用UNION ALL就会保留重复。
给你的小建议
- 如果你想彻底确认有没有重复,可以先跑个交集查询验证:
如果这个查询返回空结果,说明两个结果集完全没有重复行,用-- 假设第一个结果集是A,第二个是B SELECT * FROM ( -- 这里放你的第一个关联查询:t1.NR inner join t2.NR的语句 ) A INTERSECT SELECT * FROM ( -- 这里放你的第二个关联查询:t1.NR inner join t2.NRfromText的语句 ) B;UNION ALL更高效;如果有返回结果,说明存在重复,用UNION会自动去重。 - 不管用哪种,都要确保两个结果集的列数、列顺序、数据类型完全一致,否则
UNION会报错。
内容的提问来源于stack exchange,提问作者ASP YOK
相关产品推荐
相关产品推荐

