查询从两个表中选择相关数据,其中一个表在第三个表中没有相关字段

时间:2014-10-25 19:08:49

标签: sql oracle select group-by

我的Oracle数据库中有三个表:

Peoples:
IdPerson PK
Name
Surname

Earnings:
IdEarning PK
IdPerson
EarningValue

Awards:
IdAward PK
IdPerson FK
AwardDescription

因此,一个人可以有很多收入,一个收入或者没有任何收入。此外,一个人可以获得许多奖项,一个奖项,或者没有奖励。

我必须选择SurnameAwardDescription,但仅适用于有任何收入的人,因为有可能获得奖励,但也没有任何收入!

我的问题是做出正确的group by声明。我使用下面发布的查询,并且我选择了具有奖励描述的人的姓氏,但是对于此人的收入,它是重复的。

SELECT AwardDescription, Surname
FROM Awards
INNER JOIN People ON People.IdPerson= Awards.IdPerson
INNER JOIN Earnings ON Earnings .IdPerson= People.IdPerson;

如何对其进行分组并避免为每个人的收入重复行? 一个人可以分多行,但奖励不同。

2 个答案:

答案 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;