다른 테이블에없는 ID로 레코드를 찾기위한 SQL 쿼리
데이터베이스에 기본 키를 바인딩하는 두 개의 개의 테이블이 있고 그 사이에 분리 된 집합을 찾고 싶습니다. 예를 들면
Table1
열 (ID, Name
)과 샘플 데이터가 있습니다.(1 ,John), (2, Peter), (3, Mary)
Table2
열 (ID, Address
)과 샘플 데이터가 있습니다.(1, address2), (2, address2)
에서 내가 ID로 행을 더 수 있기 때문에 SQL 쿼리를 작성하는 방법 table1
즉 아닙니다 table2
. 이 (3, Mary)
경우 반품해야합니까?
추신. ID는이 두 테이블의 기본 키입니다.
미리 감사드립니다.
이 시도
SELECT ID, Name
FROM Table1
WHERE ID NOT IN (SELECT ID FROM Table2)
사용하다 LEFT JOIN
SELECT a.*
FROM table1 a
LEFT JOIN table2 b
on a.ID = b.ID
WHERE b.id IS NULL
빠른 대안
각각 ~ 2M 행이있는 두 개의 테이블을 사용하여 몇 가지 테스트 (postgres 9.5에서)를 실행했습니다. 아래 의이 쿼리는 제안 된 다른 쿼리보다 최소 5 * 더 나은 성능을 보였습니다.
-- Count
SELECT count(*) FROM (
(SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
) t1_not_in_t2;
-- Get full row
SELECT table1.* FROM (
(SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
) t1_not_in_t2 JOIN table1 ON t1_not_in_t2.id=table1.id;
위의 @John Woo의 댓글 / 링크에있는 요점을 염두에두면 일반적으로 다음과 같이 처리합니다.
SELECT t1.ID, t1.Name
FROM Table1 t1
WHERE NOT EXISTS (
SELECT TOP 1 NULL
FROM Table2 t2
WHERE t1.ID = t2.ID
)
기본적으로 not exists
, not in
및 left join / is null
.
NULL로 LEFT JOIN
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
안
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
존재하지 발생
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
어느 것이 더 낫입니까? 이 질문에 대한 대답은 주요 특정 RDBMS 공급 업체로 분류하는 것이 더 나을 수 있습니다. 일반적으로 select ... where ... in (select...)
하위 쿼리의 레코드 수 크기를 알 수없는 경우 사용을 피해야 합니다. 일부 공급 업체는 크기를 제한 할 수 있습니다. 예를 들어 Oracle의 제한은 1,000 입니다. 가장 좋은 방법은 세 가지를 모두 시도하고 실행 계획을 세우는 것입니다.
특히 PostgreSQL을 형성하고 실행 계획 NOT EXISTS
과 LEFT JOIN / IS NULL
동일합니다. 나는 개인적으로 NOT EXISTS
더 나은 의도를 보여주기 때문에 옵션을 선호합니다 . 결국 의미론은 A에서 pk 가 B에 존재하지 않는 레코드를 찾고 싶다는 것 입니다.
오래되었지만 여전히 금색이며 PostgreSQL에만 해당됩니다. https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
SELECT COUNT(ID) FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b) --For count
SELECT ID FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b) --For results
참고 URL : https://stackoverflow.com/questions/12048633/sql-query-to-find-record-with-id-not-in-another-table
'IT' 카테고리의 다른 글
유효한 16 진수 색상 표현인지 확인하는 방법은 무엇입니까? (0) | 2020.08.11 |
---|---|
AWS Elastic Beanstalk의 Nginx conf에서 client_max_body_size 늘리기 (0) | 2020.08.11 |
자바 펼쳐의 플랫 배열에서 트리 배열 빌드 (0) | 2020.08.11 |
Eclipse의 언 바운드 클래스 경로 컨테이너 (0) | 2020.08.11 |
Android에서 TextView에 대한 표준 배송 대체해야 할 행동입니까? (0) | 2020.08.11 |