sql - 如何从 View 中删除 "duplicate"行?

标签 sql sql-server-2005 tsql

当我加入主表时,我有一个工作正常的 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 OUTERINNER JOIN ,我丢失了拥有这些“重复”行的客户的所有行。

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

笔记:

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

How can I remove duplicate rows?

最佳答案

如果行有任何不同的列,DISTINCT 将无济于事。显然,您要加入的其中一个表在另一个表中的一行中有多个行。要恢复一行,您必须消除要加入的表中的其他多行。

执行此操作的最简单方法是增强您的 where 子句或 JOIN 限制,使其仅连接到您想要的单个记录。通常这需要确定一个规则,该规则将始终从另一个表中选择“正确”的条目。

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

Person:  Jane
Pets: Cat, Dog

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

如果您的观点是列出人和宠物的所有组合,这是完全正确的。但是,如果您的 View 应该列出养宠物的人,或者列出人们并显示他们的一只宠物,那么您就遇到了现在的问题。为此,您需要一个规则。
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 的 Pet(在 Pets 表中的第一个)。 WHERE 子句本质上是说“没有属于同一个人且 ID 值较低的宠物)。

这将产生一个记录结果:
Jane|Cat

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

如果您开始过滤掉有效数据,您可能需要重新考虑您的 View 的内容,以及您试图用您的 View 完成什么。

关于sql - 如何从 View 中删除 "duplicate"行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109640/

相关文章:

performance - T-SQL 中 SELECT 与 SET 的速度

sql - 如何使用 SQL 删除 XML 中的多个节点

SQL Server 2005 - 在比较中使用 Null

sql - 如果所有外部行都处于非事件状态,则获取行

c# - Entity Framework : Include and Where clause in generic repository

sql-server - 在查询中加入表值函数

mysql - 计算MySQL中其他平均值的平均值

SQL插入两个表的问题

java - 如何在数据库中保存样式文本并在 JEditor Pane 中检索相同样式的文本

sql-server - 错误后继续执行INSERT,SQL