Sql 我如何删除“;“重复”;视图中的行?

Sql 我如何删除“;“重复”;视图中的行?,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,当我加入我的主桌时,我有一个效果很好的视图: LEFT OUTER JOIN OFFICE ON CLIENT.CASE_OFFICE = OFFICE.TABLE_CODE. 但是,我需要添加以下连接: LEFT OUTER JOIN OFFICE_MIS ON CLIENT.REFERRAL_OFFICE = OFFICE_MIS.TABLE_CODE 虽然我添加了不同的,,但仍然会得到一个“重复”行。我之所以说“复制”,是因为第二行的值不同 但是,如果我将左侧外部更改为内部联接,则会

当我加入我的主桌时,我有一个效果很好的视图:

LEFT OUTER JOIN OFFICE ON CLIENT.CASE_OFFICE = OFFICE.TABLE_CODE.
但是,我需要添加以下连接:

LEFT OUTER JOIN OFFICE_MIS ON CLIENT.REFERRAL_OFFICE = OFFICE_MIS.TABLE_CODE 
虽然我添加了不同的
,但仍然会得到一个“重复”行。我之所以说“复制”,是因为第二行的值不同

但是,如果我将
左侧外部
更改为
内部联接
,则会丢失具有这些“重复”行的客户端的所有行

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


注: 此问题不适用于这种情况:


如果第二行有一个不同的值,那么它不是真正重复的,应该包括在内。

您可以尝试使用不同的Top 1,但正如Hunter所指出的,如果有,如果哪怕有一列是不同的,那么应该包括它,或者如果您不关心或不需要该列,您可能应该删除它。任何其他建议都可能需要更具体的信息


编辑:使用不同的Top 1时,需要有一个适当的group by语句。你真的是在使用前1部分。区别就在这里,因为如果排名前1的球队打成平局,你会在没有办法避免平局的情况下出错。我见过的两种最常见的方法是将Distinct添加到Top 1,或者您可以向查询中添加一个唯一的列,这样sql就可以选择在其他情况下是平局的记录中选择哪个记录

您可以使用
分组方式,而不是使用
DISTINCT

  • 按要作为唯一值返回的所有字段分组
  • 使用
    MIN
    /
    MAX
    /
    AVG
    或任何其他函数为可能返回多个值的字段提供一个结果
例子:
如果行中有任何不同的列,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);
您需要应用于视图的规则将取决于您拥有的列中的数据,以及列中应显示哪些“多个”记录。然而,这最终会隐藏一些数据,而这些数据可能不是您想要的。例如,上述规则隐藏了简有一只狗的事实。这让简看起来好像只有一只猫,但这并不正确


如果开始筛选出有效数据,您可能需要重新考虑视图的内容,以及您试图用视图完成的操作。

所以您添加了一个匹配两行的左外部联接?我想OFFICE_MIS.TABLE_代码在该表中不是唯一的?您需要将该连接限制为仅获取一行。这取决于你要找哪一排,但你可以这样做

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 */)

你介意清理一下你的问题,用代码块和更明确的例子吗?不,不介意。主表上只有一行,我的视图中只需要一行,即使我的数据是错误的。2行在我的报告中造成严重破坏。我使用了distinct。我不能使用不同的前1名-我有50万条记录,需要报告所有记录。非常感谢Rich B。我将使用你的建议。谢谢你Bryan。我会应用你的建议。@Lieven:到目前为止,你的解决方案对我很有效。否则,我无法完全更改查询,这涉及5个表之间的连接和3个这样的查询之间的并集。谢谢。这是一个有趣的方法。这比我答案中的select top 1子查询快吗?我不确定它是否比select top快,但我想展示一个应用规则的通用示例。上面的select也可能有一个完全不同的WHERE子句,或者对连接的限制是“WHERE Pets.Name='Cat'”。概念是需要一个规则,它必须特定于正在开发的视图和需要呈现的数据的上下文。
Jane|Cat
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 */)