当前位置: 首页 > 面试题库 >

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

楚嘉纳
2023-03-14
问题内容

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

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表中第一个)的Pet。WHERE子句从本质上说:“在没有宠物属于同一个人且ID值较低的情况下”。

这将产生一个记录结果:

Jane|Cat

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

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



 类似资料:
  • 问题内容: 我有一张像这样的桌子: ID为 ,自创建表以来一直在使用。 我想要做的是删除除一个记录以外的所有记录,其中所有其他列都相同。 问题答案: 当然,您必须在所有三个位置将col1,col2扩展到所有列。 编辑:我只是从保留的脚本中重新进行了测试,然后重新测试,它在MySQL中执行。

  • 我构建了一个使用BingAPI下载数据集的代码。当我在终端上运行它时,它返回以下错误: 所以我升级了Numpy,但没有用 那么我该怎么做呢?

  • 我有一个arraylist,它包含一对整数(例如int i,int j)。但它可能包含重复对(如(int i,int j)和(int j,int i))。现在如何在O(n)时间复杂度中去除重复。

  • 问题内容: 我有微调框。数据加载完成后,控制器将重定向到其他视图。如何从历史记录中删除#/ load-data以避免进入#/ load-data视图? 问题答案: 您可以使用该方法替换上一个历史记录条目。 这是文档的链接。 因此,在显示微调器时,可以使用以下几行切换到实际视图: 或更短:

  • 问题内容: 我想从列表中删除重复项,但我无法正常工作: 问题答案: 如果该代码不起作用,则可能是你未在该类上正确实现。 大概有一些钥匙(我们称之为)可以唯一地标识一个客户。例如 的适当定义equals(Object)如下所示: 为了完整起见,你还应该实现hashCode两个Customer相等的对象将返回相同的哈希值。hashCode上述定义的匹配项为equals: 还值得注意的是,如果列表很大,

  • 问题内容: 假设我们有一个具有这种格式的对象: 我想做一个通过键删除的函数: 问题答案: 该运算符允许您从对象中删除属性。 以下示例都做同样的事情。