如果行中有任何不同的列,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最小的Pet(在Pets表中排名第一)。WHERE子句实际上是说“当没有属于同一个人的宠物具有更低的ID值时”。
这将产生一个记录结果:
Jane|Cat
您需要应用于视图的规则取决于您所拥有的列中的数据以及哪些“多个”记录应在该列中显示。但这会隐藏一些数据,这可能不是您想要的。例如,上述规则隐藏了Jane拥有一只狗的事实。它使Jane只有一只猫,而这是不正确的。
如果您开始过滤有效数据,则可能需要重新考虑视图的内容以及您试图通过视图实现的目标。