2014-10-25 3 views
0

세 번째 테이블에 관련 분야가 없습니다있는 두 테이블에서 관련 데이터를 선택합니다 수입이 없다. 또한 한 사람에게는 많은 상, 하나의 상 또는 어떤 상도 줄 수 없습니다.쿼리는 하나 개의 테이블이 내 오라클 DB에있는 세 개의 테이블이

SurnameAwardDescription을 선택해야합니다. 일부 보너스를받을 수도 있고 수입도 없으므로 수입이있는 사람 만 선택할 수 있습니다!

제 문제는 올바른 group by 문을 작성하는 것입니다. 아래에 게시 된 쿼리를 사용하고 수상 내역을 가진 사람의 성을 선택하지만이 사람의 수입에서 각 행에 대해 중복됩니다.

개인을 수입 할 때마다 행을 그룹화하고 행을 복제하지 않으려면 어떻게해야합니까? 한 사람은 여러 행에있을 수 있지만 다른 상을 수 있습니다.

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

또는 다른 옵션은 EXISTS을 사용하는 것입니다 :

+0

같은 테이블 사이 left outer join를 수행 왼쪽을 외부 조인. – Rahul

답변

0

당신은 당신의 쿼리에 DISTINCT를 추가 할 수

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); 
+0

별명을 사용하는 경우 각 사람마다 상 이름이 중복되면 행을 반환하지 않습니다. 두 번째 옵션을 시도 할 때 수익이있는 사람들은 아무 것도 반환되지 않았습니다. 왜 지금 –

+0

@ user2838197 - 왜 '별개'가 필요한지를 분석하지 않습니다. 그러나 '존재한다'- 소득이있는 사람들이 상을받지 못하면 '존재한다'는 것을 나타내지 않을 것입니다. 외부 조인을 사용해야합니다 -'p.idperson = a.idperson'에 사람들이 남긴 포상 a 왼쪽. – sgeddes

+1

죄송합니다! 존재감이 좋습니다! 여기에 많은 데이터가 있습니다. 조금 혼란 스러웠습니다.하지만 그것을 정리했습니다. 존재와 함께 완벽하게 작동합니다! 고맙습니다! –

0

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; 
+0

나는 당신이 질문을 잘못 이해했다고 생각한다. 문제는 외부 조인이 아닌 행을 복제하는 것이다. OP는 '수입이있는 사람 만'이라고 말하면 모든 상을 반환합니다. – sgeddes

관련 문제