从 sql union 中删除重复项
Posted
技术标签:
【中文标题】从 sql union 中删除重复项【英文标题】:remove duplicates from sql union 【发布时间】:2010-11-08 20:23:22 【问题描述】:我正在使用联合(正确或错误)对我拥有的几张表执行一些基本的 sql
但我需要删除重复项。有什么想法吗?
select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4
【问题讨论】:
您是说您的查询不会删除重复项吗? 【参考方案1】:Union
将删除重复项。 Union All
没有。
【讨论】:
这是对的,至少对于 MS SQL。 有趣...不会删除上述声明中的重复项 @thegunner - 您是否碰巧将 Timestamp 数据类型作为您的列之一? @thegunner - Union 实际上确实删除了重复项。我会从两个查询中删除 selct * 并手动一次添加一列,直到您发现您认为发生重复的情况。当你找到一个时,数据类型是什么? 实际上 - 在第二次查看时,我没有添加一些列;期望使行独一无二。我再看看查询 - 谢谢。【参考方案2】:除非您指定UNION ALL
,否则使用UNION
会自动删除重复行:
http://msdn.microsoft.com/en-us/library/ms180026(SQL.90).aspx
【讨论】:
这是否包括由“联合”查询之一返回的重复行?【参考方案3】:其他人已经回答了您的直接问题,但也许您可以简化查询以消除问题(或者我是否遗漏了什么,像下面这样的查询真的会产生截然不同的结果?):
select *
from calls c join users u
on c.assigned_to = u.user_id
or c.requestor_id = u.user_id
where u.dept = 4
【讨论】:
请注意,Join 中的 OR 会导致表扫描,不是理想的解决方案【参考方案4】:由于您仍然只使用 UNION
重复,我会检查:
它们是完全重复的。我的意思是,如果你做一个
SELECT DISTINCT * FROM (<your query>) AS subquery
你得到的文件更少了吗?
您在查询的第一部分中还没有重复项(可能由左连接生成)。据我了解UNION
它不会添加到结果集中已经存在的行,但不会删除第一个数据集中已经存在的重复项。
【讨论】:
至少 T-SQL 会删除所有重复项,即使它们来自同一个数据集。 我摸不着头脑,然后我阅读了您的解决方案并检查了...... 1 列不一样......因此,“重复”行......【参考方案5】:如果您使用的是 T-SQL,那么从以前的帖子中可以看出 UNION 删除了重复项。但如果你不是,你可以使用 distinct。这对我来说也不太合适,但它可以为您提供您正在寻找的结果
SELECT DISTINCT *
FROM
(
select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4
)a
【讨论】:
这不适用于我的情况。我仍然有 2 列具有相同的数据【参考方案6】:如果您使用的是 T-SQL,您可以在存储过程中使用临时表并相应地更新或插入查询记录。
【讨论】:
请确保您的回答提供更多详细信息,如果您想指出可以使用 cmets 的内容以上是关于从 sql union 中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章