2013-11-27 2 views
1

테이블 "person", 연관 테이블 "person_vaccination"및 테이블 "vaccination"이 있습니다.SQL - assocciative에서 두 번째 테이블에없는 것을 선택하십시오.

예방 접종을받지 못한 사람을 만나고 싶지만 지금까지 이드가있을 때만 작동하도록했습니다.

SELECT vac.VACCINATION_Name 
FROM VACCINATION vac 
WHERE vac.VACCINATION_NUMBER NOT IN 
(SELECT v.VACCINATION_NUMBER 
FROM PERSON per 
Join PERSON_VACCINATION pv ON per.PERSON_NUMBER = pv.PERSON_NUMBER 
JOIN VACCINATION v ON pv.VACCINATION_NUMBER = v.VACCINATION_NUMBER 
WHERE per.PERSON_NUMBER = 6) 

제대로 작동하지만 모든 사람들이 백신 접종을받지 못하게하려면 어떻게해야합니까? (예 : 555, 555 Vacccination 1, Vacccination 2 666, Vacccination 1) 대신 INNER이 조인, 당신은 LEFT JOIN을 사용해야의

+0

1) IN (...) 절을 EXISTS (...) 절로 다시 씁니다. 2) _ 존재하지 않는 존재가 존재합니다. 3) 이익! – wildplasser

+0

예방 접종을받지 않은 사람들이나 특정 예방 접종을받지 못한 사람들을 찾고 계십니까? –

답변

2

SQL Fiddle

오라클 11g R2 스키마 설정 :

CREATE TABLE VACCINATION (VACCINATION_NUMBER, VACCINATION_NAME) AS 
      SELECT 1, 'Vac 1' FROM DUAL 
UNION ALL SELECT 2, 'Vac 2' FROM DUAL 
UNION ALL SELECT 3, 'Vac 3' FROM DUAL 
UNION ALL SELECT 4, 'Vac 4' FROM DUAL; 

CREATE TABLE PERSON_VACCINATION (VACCINATION_NUMBER, PERSON_NUMBER) AS 
      SELECT 1, 1 FROM DUAL 
UNION ALL SELECT 2, 1 FROM DUAL 
UNION ALL SELECT 3, 1 FROM DUAL 
UNION ALL SELECT 4, 1 FROM DUAL 
UNION ALL SELECT 1, 2 FROM DUAL 
UNION ALL SELECT 2, 2 FROM DUAL 
UNION ALL SELECT 3, 2 FROM DUAL; 

CREATE TABLE PERSON (PERSON_NUMBER, PERSON_NAME) AS 
      SELECT 1, 'P1' FROM DUAL 
UNION ALL SELECT 2, 'P2' FROM DUAL 
UNION ALL SELECT 3, 'P3' FROM DUAL; 

검색어 1 :

SELECT p.PERSON_NAME, 
     v.VACCINATION_NAME 
FROM VACCINATION v 
     CROSS JOIN 
     PERSON p 
WHERE NOT EXISTS (SELECT 1 
        FROM PERSON_VACCINATION pv 
        WHERE pv.VACCINATION_NUMBER = v.VACCINATION_NUMBER 
        AND pv.PERSON_NUMBER = p.PERSON_NUMBER) 
ORDER BY p.PERSON_NAME, 
     p.PERSON_NUMBER, 
     v.VACCINATION_NAME, 
     v.VACCINATION_NUMBER 
,691,363을

Results210 :

| PERSON_NAME | VACCINATION_NAME | 
|-------------|------------------| 
|   P2 |   Vac 4 | 
|   P3 |   Vac 1 | 
|   P3 |   Vac 2 | 
|   P3 |   Vac 3 | 
|   P3 |   Vac 4 | 
+0

우수! 짧은 & 달콤한, 고마워! – user3043748

+0

당신은 저를 똑같은 대답으로 이겼습니다 =) – Kairan

0

없이 예방 접종을 가진 사람들이 전혀, 당신은 다음 PERSON_VACCINATION 열이 NULL 모든 항목을 찾을 수 있습니다, 왼쪽 외부가 개인과 PERSON_VACCINATION 사이에 가입 사용할 수 있습니다 후 경우.

SELECT PERSON_NUMBER 
FROM PERSON P 
LEFT OUTER JOIN 
PERSON_VACCINATION PV 
ON P.PERSON_NUMBER = PV.PERSON_NUMBER 
WHERE PV.PERSON_NUMBER IS NULL 

당신은 LEFT OUTER 익숙하지 않은 경우

그것은 사람의 각 행에 대해 PERSON_VACCINATION에 일치하는 행을 찾습니다, 가입. 일치하는 행이 없으면 결과 행의 PERSON 행을 떠나 PERSON_VACCINATION 테이블의 모든 열에 대해 NULL 값을 표시합니다.

사람들의 목록과 예방 접종을 원할 경우 @ MT0의 답이 맞습니다. PERSON과 VACCINATION의 모든 가능한 조합 (교차 결합)을 포함하는 결과 세트를 작성한 다음 PERSON_VACCINATION에 실제로 어떤 조합이 존재하는지 점검해야합니다. 존재하지 않는 항목은 누락 된 예방 접종입니다.

관련 문제