다른 테이블에 없는 ID의 레코드를 찾기 위한 SQL 쿼리
데이터베이스에 바인딩 기본 키가 있는 테이블이 두 개 있는데 그 테이블 사이에 분리된 세트를 찾고 싶습니다.예를들면,
Table1
열이 있음(ID, Name
) 및 샘플 데이터:(1 ,John), (2, Peter), (3, Mary)
Table2
열이 있음(ID, Address
) 및 샘플 데이터:(1, address2), (2, address2)
ID가 있는 행을 가져올 수 있도록 SQL 쿼리를 생성하려면 어떻게 해야 합니까?table1
에 없는table2
이 경우에는,(3, Mary)
반환되어야 합니까?
PS: 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
이에 대한 접근 방식은 기본적으로 세 가지입니다.not exists
,not in
그리고.left join / is null
.
왼쪽 조인이 null입니다.
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개의 제한이 있습니다.가장 좋은 방법은 세 가지를 모두 시도하고 실행 계획을 보여주는 것입니다.
구체적으로 Postgre를 작성합니다.SQL, 실행 계획NOT EXISTS
그리고.LEFT JOIN / IS NULL
똑같습니다.나는 개인적으로 그것을 선호합니다.NOT EXISTS
더 나은 의도를 보여주기 때문입니다.결국 의미론적으로는 A에서 PK가 B에 존재하지 않는 기록을 찾고자 하는 것입니다.
오래되었지만 여전히 금빛, 포스트그레 특유의SQL 그래도: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
빠른 대안
각각 ~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
)
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
'programing' 카테고리의 다른 글
"애저웹 앱"과 "애저앱 서비스"의 차이점은 무엇입니까? (0) | 2023.05.08 |
---|---|
아레 포스트그레SQL 열 이름은 대소문자를 구분합니까? (0) | 2023.05.03 |
AngularJS에서 컨트롤러 간에 통신하는 올바른 방법은 무엇입니까? (0) | 2023.05.03 |
로그 파일 및 콘솔에 출력 쓰기 (0) | 2023.05.03 |
iOS 10에서 UITextView 상단의 공백 (0) | 2023.05.03 |