我有工作正常,当我加入我的主表的视图:
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|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
该规则时,你需要申请到您的视图将取决于你有列中的数据,且其“多个”记录应显示在列。 然而,这将拉闸隐藏一些数据,你想要什么这可能不是。 例如,上述规则隐藏了简有一个狗的事实。 这使得它看起来好像简只有一个猫,当这是不正确的。
您可能需要重新考虑你的观点的内容,你正在尝试用你的观点来完成的,如果你已经开始筛选出有效数据。
如果secondd行有一个不同的值,它是不是真的复制并应包括在内。
所以,你增加了一个左外连接是匹配的两行? 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 */)
而不是使用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
你可以尝试使用鲜明的顶部1,但亨特指出,如果有,如果连一列是不同的,那么它应该要么被包含,或者如果你不关心或需要列你应该将其删除。 任何其他建议,可能会需要更具体的信息。
编辑:在使用前鲜明1,你需要通过声明有一个相应的组 。 你真的会使用TOP 1份。 独特是在那里,因为如果有一个顶部1平手,你会得到一个错误,而无需某种方式避免了领带。 我见过的最常见的两种方式都将清晰到前1或者你可以一列是唯一的,这样的sql将有办法来选择,否则这将是一个领带挑选其中记录查询添加。