2016-10-27 3 views
0

이 글을 쓰는 방법을 알아낼 수 없습니다. 저는 4 개의 테이블을 가지고 있습니다 : 수상자 목록, 배우, 프로듀서 및 TV 쇼에 실제로 주어지는 상입니다. 후자 그룹은 복합 키로 식별 할 수 있습니다. 나는 포기하지 않은 상을 모두 나열하고 싶습니다. 지금까지 내가 한 일이 여기있다.SQL에서 복합 키를 비교하는 중

  • 상 PK {award_name, award_type, award_year}
  • actoraward 약동학 {award_name, award_type, award_year} FK {award_name, award_type, award_year}
  • prodaward 약동학 {award_name, award_type, award_year FK} {award_name, award_type, award_year
  • }
  • showaward 약동학 {award_name, award_type, FK award_year} {award_name, award_type, award_year
  • }
SELECT AWARD.AWARD_NAME, AWARD.AWARD_TYPE, AWARD.AWARD_YEAR 
FROM AWARD 
WHERE NOT EXISTS 
    (
    SELECT * 
    FROM AWARD AW, ACTORAWARD ACAW 
    WHERE (AW.AWARD_NAME = ACAW.AWARD_NAME AND AW.AWARD_TYPE = ACAW.AWARD_TYPE AND AW.AWARD_YEAR = ACAW.AWARD_YEAR) 
) 

AND NOT EXISTS 
    (
    SELECT * 
    FROM AWARD AW, PRODAWARD PRAW 
    WHERE (AW.AWARD_NAME = PRAW.AWARD_NAME AND AW.AWARD_TYPE = PRAW.AWARD_TYPE AND AW.AWARD_YEAR = PRAW.AWARD_YEAR) 
) 

AND NOT EXISTS 
    (
    SELECT * 
    FROM AWARD AW, SHOWAWARD SHAW 
    WHERE (AW.AWARD_NAME = SHAW.AWARD_NAME AND AW.AWARD_TYPE = SHAW.AWARD_TYPE AND AW.AWARD_YEAR = SHAW.AWARD_YEAR) 
) 

구문이 좋기 때문에 걱정하지 않아도 존재하지 않으며 작동하지 않으며 세 가지 값을 동시에 IN을 사용하여 비교할 수 없으므로이 문제를 해결하려면 어떻게해야합니까?

+1

관련이 없지만 : WHERE 절에서 고대, 구식 및 연약한 암시 적 조인을 사용하지 말아야합니다. 명시 적으로 'JOIN'연산자를 사용하여 시작합니다 (비록 내가 말했듯이, 이러한 조인은 필요하지 않습니다) –

답변

2

하위 선택에서 조인이 필요하지 않습니다. 예, 당신은 IN 절을 사용하여 여러 값을 비교할 수 있습니다 동시에 IN

사용

SELECT aw.award_name, aw.award_type, aw.award_year 
FROM award aw 
WHERE NOT EXISTS (SELECT * 
        FROM actoraward acaw 
        WHERE aw.award_name = acaw.award_name 
        AND aw.award_type = acaw.award_type 
        AND aw.award_year = acaw.award_year) 
    AND NOT EXISTS (SELECT * 
        FROM prodaward praw 
        WHERE aw.award_name = praw.award_name 
        AND aw.award_type = praw.award_type 
        AND aw.award_year = praw.award_year) 
    AND NOT EXISTS (SELECT * 
        FROM showaward shaw 
        WHERE aw.award_name = shaw.award_name 
        AND aw.award_type = shaw.award_type 
        AND aw.award_year = shaw.award_year); 

나는 세 가지 값을 비교할 수 없습니다 : 대신 공동 관련된 하위 쿼리를 사용

SELECT * 
FROM award aw 
WHERE (aw.award_name, aw.award_type, aw.award_year) 
     NOT IN ( 
       SELECT acaw.award_name, acaw.award_type, acaw.award_year 
       FROM actoraward acaw 
       UNION 
       SELECT praw.award_name, praw.award_type, praw.award_year 
       FROM prodaward praw 
       UNION 
       SELECT shaw.award_name, shaw.award_type, shaw.award_year 
       FROM showaward shaw 
      ) 

그럴 가능성이 가장 낮은 버전은입니다.

관련 문제