如何删除从视图中“重复”行?(How do I remove “duplicate” rows fr

2019-06-25 14:24发布

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

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 OUTERINNER JOIN ,我输了谁拥有这些“重复”行客户的所有行。

我究竟做错了什么? 我怎样才能把我的观点,这些“重复”行?


注意:

这个问题不适用在这种情况下:

如何删除重复的行?

Answer 1:

DISTINCT不会帮助你,如果该行具有不同的列。 很显然,要加入到一个表有另一个表中的单列多行。 为了得到一个行回来,你必须消除您加入到表中的其他多行。

要做到这一点最简单的方法是提高你的where子句或JOIN限制只能加入到你想的一条记录。 通常这需要确定一个规则,将始终选择从其他表中的“正确”的条目。

让我们假设你有一个简单的问题,比如这个:

Person:  Jane
Pets: Cat, Dog

如果你创建一个简单的在这里加入,您将收到两条记录简:

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);

这样做是适用的规则来限制加入到给宠物用最低的ID(先在宠物表)的宠物纪录。 WHERE子句实际上是说“那里有属于同一人用较低的ID值没有宠物)。

这将产生一个记录结果:

Jane|Cat

该规则时,你需要申请到您的视图将取决于你有列中的数据,且其“多个”记录应显示在列。 然而,这将拉闸隐藏一些数据,你想要什么这可能不是。 例如,上述规则隐藏了简有一个狗的事实。 这使得它看起来好像简只有一个猫,当这是不正确的。

您可能需要重新考虑你的观点的内容,你正在尝试用你的观点来完成的,如果你已经开始筛选出有效数据。



Answer 2:

如果secondd行有一个不同的值,它是不是真的复制并应包括在内。



Answer 3:

所以,你增加了一个左外连接是匹配的两行? 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 */)


Answer 4:

而不是使用DISTINCT ,你可以使用一个GROUP BY

  • 所有你想要的字段集团将返回唯一值。
  • 使用MIN / MAX / AVG或任何其他功能给你一个结果为可能返回多个值的字段。

例:

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


Answer 5:

你可以尝试使用鲜明的顶部1,但亨特指出,如果有,如果连一列是不同的,那么它应该要么被包含,或者如果你不关心或需要列你应该将其删除。 任何其他建议,可能会需要更具体的信息。

编辑:在使用前鲜明1,你需要通过声明有一个相应的 。 你真的会使用TOP 1份。 独特是在那里,因为如果有一个顶部1平手,你会得到一个错误,而无需某种方式避免了领带。 我见过的最常见的两种方式都将清晰前1或者你可以一列是唯一的,这样的sql将有办法来选择,否则这将是一个领带挑选其中记录查询添加。



文章来源: How do I remove “duplicate” rows from a view?