从 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 中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从 SQLite 中的 SQL 查询结果中删除重复项

如何不排序就执行UNION? (SQL)

从 SQL Join 中删除重复项

从 MySQL 中具有不同列的表的多个连接结果中删除重复项

BigQuery 标准 SQL:从表中删除重复项

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项