2011-10-26 2 views
0

Oracle을 사용하고 있습니다.하나의 테이블에서 값을 찾는 데 도움이 필요하고 다른 테이블에 값이 없습니다. 그 반대의 경우도 마찬가지입니다.

2 개의 테이블이 있으며 각 테이블에는 userID와 entitlementID가 있습니다. 표 1에는 있지만 표 2에는없는 권한을 선택하고 그 반대의 경우도 마찬가지입니다. 다음과 같이 출력해야합니다.

USER_ID| ENTITLEMENT_1 | ENTITLEMENT_2 

33 | 44 | <NULL> 
54 | <NULL>| 55 
33 | <NULL>| 32 

답변

-1

이 당신을 위해 작동합니다 :

SELECT * FROM Table1 t1 
LEFT JOIN 
    (SELECT userID FROM Table2) 
    AS t2 ON t1.userID=t2.userID 
+0

테이블 2에서 entitlement_2를 어떻게 검색합니까? – eaolson

+0

SELECT *를 사용하여 결과에 JOIN하면 ON 절에서 참조하는 모든 테이블의 모든 열이 포함됩니다. – Rucia

+0

오 이런, 전혀 알지도 못했습니다. * – eaolson

3

이것은 단순한 외부 아니다 가입 당신이 를 찾고 있다면 하나의 테이블에 존재하고 다른 테이블에 존재하지 않는 권한.

SELECT t1.userid, t1.entitlement_1, NULL AS entitlement_2 
    FROM table1 t1 
WHERE NOT EXISTS (SELECT 1 FROM table2 t2 
        WHERE t2.userid = t1.userid 
         AND t2.entitlement_2 = t1.entitlement_1) 
UNION ALL 
SELECT t2.userid, NULL AS entitlement_1, entitlement_2 
    FROM table2 t2 
WHERE NOT EXISTS (SELECT 1 FROM table1 t1 
        WHERE t1.userid = t2.userid 
         AND t1.entitlement_1 = t1.entitlement_2) 

첫 번째 select는 table2에없는 userid 및 entitlement_1 쌍을 찾고 두 번째 select는 그 반대입니다. userid 또는 (userid, entitlement)가 기본 키 또는 기타 항목 인 경우와 같이 관련 테이블에 대한 많은 정보를 제공하지 않았으므로이를 최적화 할 수 있습니다.

+0

아니요 테이블에 기본 키가 있습니다. 진실로 이것은 내가하는 더 큰 쿼리의 일부입니다. 질문이 하나 더 있습니다. table1의 인 타이틀먼트는 "*/*/fis/<인 타이틀먼트 ID>"형태로되어 있습니다. 어떻게 필터링 할 것인가를 알고 있습니다. 자격 ID는 table2 인 타이틀먼트 ID와 비교됩니다. – user652778

+0

ID를 추출해야합니다. 'SUBSTR (t1.entitlement_1, 9) = t2.entitlement_2' (또는 그와 같은 것) 에서처럼'SUBSTR' 또는'REGEXP_SUBSTR' 중 하나를 사용합니다. 이와 같은 함수를 사용하면 t1.entitlement 열에 인덱스가 있으면 쿼리를 느리게 할 수 있으므로 인덱스를 무시합니다. – eaolson

관련 문제