2009-09-11 5 views
1

Oracle 10g에서 다음 2 개의 테이블을 작업하고 있습니다. 다소 간단한 작업을 시도하고 있지만 기본 지식을 제대로 이해하지 못해서 내 쿼리를 제대로 수행 할 수 없습니다. BMF에없는 TEMP에서 account_no를 조회하려고합니다.SQL에서 테이블 간의 누락 된 번호 찾기

두 테이블 : 표 1 : BMF : 온도 :

account_no | trans_amount | tracking_id 

8149817  | 8100   |  72422912 

8197743  | 9100   |  72422913 

7165129  | 8100   |  72422914 

8625861  | 8100   |  72422915 

8463378  | 2100   |  72422916 

8213330  | 3100   |  72422917 

표 2 1372 행 1373 행 - 하나만 account_no가 TEMP에있다가 BMF

account_no 

8149817 

8197743 

7165129 

8625861 

8463378 

8213330 

84633 

48 

에서 실종 예상 결과 : 8463348 -이 번호는 BMF 테이블에 없습니다.

내 쿼리 : 올바른 쿼리

select a1.account_no from TEMP a1, bmf a2 
where a2.tracking_id between 72422912 and 72424283 
and a1.account_no != a2.account_no 

모든 포인터는 초보자

답변

1
SELECT account_no 
FROM TEMP 
WHERE acount_no NOT IN (SELECT account_no FROM BMF) 
+0

+1 : 이것은 가장 간단하고 명확한 방법 –

1

LEF를 사용

select a1.account_no from TEMP a1 left join bmf a2 
where a2.tracking_id between 72422912 and 72424283 
and a2.account_no = NULL 

시도, 도움이

감사 할 것이다 t 조인 후 해당 항목이없는 항목 만 취하십시오.

+0

일이다. 이것은 내가 생각하지만 이미 당신에 의해 답변입니다 :) – shahkalpesh

1

조인 구문은 외부 조인을 위해 Oracle에 의해 discouraged입니다.

왼쪽 외부 조인을 수행하고 조인되지 않은 열을 제외 할 수 있습니다. 이것은 가장 효율적인 접근 방식이어야합니다. 이런 식으로 뭔가 :

SELECT a1.account_no FROM TEMP a1 
LEFT JOIN bmf a2 ON a1.account_no = a2.account_no 
WHERE (a2.tracking_id between 72422912 and 72424283) 
AND a2.account_no IS NULL 
+0

'낙담에 의해 오라클'의견에 대한 참조를 추가 할 수 있습니까? – akf

+0

차라리 NOT EXIST 또는 NOT IN 쿼리를 가질 수 있습니다 (OP는 명시 적으로 "BMF에없는 TEMP에서"행을 요구합니다). OUTER JOIN + NULL을 사용하는 synthax는 어색합니다. –

+0

@ Vincent : 추가 쿼리와 함께 NOT IN을 사용하는 습관은 신속하게 중첩 된 내부 쿼리로 이어질 수 있습니다. 이는 완벽한 성능 저하 요인입니다. 우리가 SQL을 사용하고 있기 때문에, 우리는 절차적인 루프와 같은 구조가 아닌 세트를 다루기로되어 있습니다 ... – Lucero

3
SELECT account_no FROM temp 
WHERE NOT EXISTS (SELECT account_no FROM bmf 
        WHERE bmf.account_no = temp.account_no) 


이 여기에 다른 답변에서 SQL 같은 실행 계획이있을 것이다, 그러나 그것은 (적어도 나에게) 더 명확하게 의사를 말한다.

3

하나의 데이터 세트 (temp)에는 있지만 다른 하나 (bmf)에는없는 모든 열 값을 원하십니까? 그것이 "Minus" operator의 기능입니다.

select account_no from TEMP 
minus 
select account_no from bmf 

편집 : 추가 문서 링크