繁体   English   中英

如何从视图中删除“重复”行?

[英]How do I remove “duplicate” rows from a view?

当我加入主表时,我有一个工作正常的视图:

LEFT OUTER JOIN OFFICE ON CLIENT.CASE_OFFICE = OFFICE.TABLE_CODE.

但是我需要添加以下连接:

LEFT OUTER JOIN OFFICE_MIS ON CLIENT.REFERRAL_OFFICE = OFFICE_MIS.TABLE_CODE 

虽然我添加了DISTINCT ,但仍然会得到一个“重复”的行。 我说“重复”,因为第二行有不同的值。

但是,如果我将LEFT OUTER更改为INNER JOIN ,则会丢失具有这些“重复”行的客户端的所有行。

我究竟做错了什么? 如何从我的视图中删除这些“重复”行?


注意:

此问题不适用于此实例:

如何删除重复的行?

如果行包含任何不同的列,DISTINCT将无法帮助您。 显然,您要加入的其中一个表在另一个表中的一行中有多行。 要获得一行,您必须消除要加入的表中的其他多行。

最简单的方法是增强where子句或JOIN限制,以便只加入你想要的单个记录。 通常,这需要确定一个规则,该规则将始终从另一个表中选择“正确”条目。

我们假设您有一个简单的问题,例如:

Person:  Jane
Pets: Cat, Dog

如果您在此处创建一个简单的联接,您将收到Jane的两条记录:

Jane|Cat
Jane|Dog

如果您的观点是列出人和宠物的所有组合,这是完全正确的。 但是,如果您的观点应该列出有宠物的人,或列出人并展示他们的宠物之一,那么您就会遇到现在的问题。 为此,您需要一个规则。

SELECT Person.Name, Pets.Name
FROM Person
  LEFT JOIN Pets pets1 ON pets1.PersonID = Person.ID
WHERE 0 = (SELECT COUNT(pets2.ID) 
             FROM Pets pets2
             WHERE pets2.PersonID = pets1.PersonID
                AND pets2.ID < pets1.ID);

这样做是应用一个规则来限制连接中的Pets记录到具有最低ID的宠物(在Pets表中的第一个)。 WHERE子句基本上表示“没有宠物属于具有较低ID值的同一个人”。

这将产生一个记录结果:

Jane|Cat

您需要应用于视图的规则取决于您拥有的列中的数据,以及应在列中显示哪些“多个”记录。 但是,这最终会隐藏一些数据,这可能不是您想要的。 例如,上述规则隐藏了Jane有一只狗的事实。 如果这不正确,它会使Jane看起来好像只有一只猫。

如果您开始过滤掉有效数据,则可能需要重新考虑视图的内容以及您尝试使用视图完成的操作。

如果第二行有一个不同于它的值,那么它应该被包括在内。

那么你添加了一个匹配两行的左外连接? OFFICE_MIS.TABLE_CODE在我假设的那个表中不是唯一的吗? 您需要将该连接限制为仅抓取一行。 这取决于你要寻找哪一行,但你可以做这样的事......

LEFT OUTER JOIN OFFICE_MIS ON 
  OFFICE_MIS.ID = /* whatever the primary key is? */
    (select top 1 om2.ID
    from OFFICE_MIS om2
    where CLIENT.REFERRAL_OFFICE = om2.TABLE_CODE
    order by om2.ID /* change the order to fit your needs */)

您可以使用GROUP BY而不是使用DISTINCT

  • 将要作为唯一值返回的所有字段分组。
  • 使用MIN / MAX / AVG或任何其他函数为可返回多个值的字段提供一个结果。

例:

SELECT Office.Field1, Client.Field1, MIN(Office.Field1), MIN(Client.Field2)  
FROM YourQuery  
GROUP BY Office.Field1, Client.Field1

您可以尝试使用Distinct Top 1,但正如Hunter指出的那样,如果甚至有一列不同,那么它应该被包括在内,或者如果您不关心或需要该列,您应该将其删除。 任何其他建议可能需要更具体的信息。

编辑:当使用Distinct Top 1时,你需要有一个合适的group by语句。 你真的会使用前1部分。 区别就在那里,因为如果Top 1有一个平局你将得到一个错误,而没有办法避免平局。 我见过的两种最常见的方法是将Distinct添加到Top 1,或者你可以在查询中添加一个唯一的列,这样sql就可以选择在哪个记录中选择哪个记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM