我的Oracle数据库中有三个表:
Peoples:
IdPerson PK
Name
Surname
Earnings:
IdEarning PK
IdPerson
EarningValue
Awards:
IdAward PK
IdPerson FK
AwardDescription
因此,一个人可以有很多收入,一个收入或者没有任何收入。此外,一个人可以获得许多奖项,一个奖项,或者没有奖励。
我必须选择Surname
和AwardDescription
,但仅适用于有任何收入的人,因为有可能获得奖励,但也没有任何收入!
我的问题是做出正确的group by
声明。我使用下面发布的查询,并且我选择了具有奖励描述的人的姓氏,但是对于此人的收入,它是重复的。
SELECT AwardDescription, Surname
FROM Awards
INNER JOIN People ON People.IdPerson= Awards.IdPerson
INNER JOIN Earnings ON Earnings .IdPerson= People.IdPerson;
如何对其进行分组并避免为每个人的收入重复行? 一个人可以分多行,但奖励不同。
答案 0 :(得分:0)
您可以在查询中添加DISTINCT
:
SELECT DISTINCT AwardDescription, Surname
FROM Awards
INNER JOIN People ON People.IdPerson= Awards.IdPerson
INNER JOIN Earnings ON Earnings .IdPerson= People.IdPerson;
或另一种选择是使用EXISTS
:
SELECT AwardDescription, Surname
FROM Awards
INNER JOIN People P ON P.IdPerson= Awards.IdPerson
WHERE EXISTS (
SELECT 1
FROM Earnings E
WHERE P.IdPerson = E.IdPerson);
答案 1 :(得分:0)
在表格中执行left outer join
,例如
SELECT p.Surname, a.AwardDescription, e.EarningValue
FROM People p
LEFT JOIN Awards a ON p.IdPerson= a.IdPerson
LEFT JOIN Earnings e ON e.IdPerson= p.IdPerson
WHERE a.AwardDescription IS NOT NULL
OR e.EarningValue IS NOT NULL;