[sql] 한 테이블에서 다른 테이블에 존재하지 않는 모든 레코드를 선택하는 방법은 무엇입니까?

table1 (ID, 이름)
table2 (ID, 이름)

질문:

SELECT name
FROM table2
-- that are not in table1 already



답변

SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

Q : 여기서 무슨 일이 일어나고 있습니까?

A : 개념적으로 우리는 모든 행을 선택하고 table1각 행에 대해 table2동일한 name열 값을 가진 행을 찾습니다 . 그러한 행이 없으면 table2해당 행에 대해 결과 부분을 비워 둡니다 . 그런 다음 일치하는 행이 존재하지 않는 결과에서 해당 행만 선택하여 선택을 제한합니다. 마지막으로, name열을 제외하고 결과의 모든 필드를 무시합니다 table1.

모든 경우에 가장 성능이 좋은 방법은 아니지만 기본적으로 ANSI 92 SQL 을 구현하려는 모든 데이터베이스 엔진에서 작동해야합니다.


답변

당신은 할 수 있습니다

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name
     FROM table1)

또는

SELECT name
FROM table2
WHERE NOT EXISTS
    (SELECT *
     FROM table1
     WHERE table1.name = table2.name)

이것을 달성 하기 위해 3 가지 기술에 대한 이 질문 을 참조하십시오


답변

두 번째 답변에 투표 할 충분한 담당자 점수가 없습니다. 그러나 나는 최고 답변에 대한 의견에 동의하지 않아야합니다. 두 번째 답변 :

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name
     FROM table1)

실제로 FAR이 더 효율적입니다. 왜 그런지 모르겠지만 800k + 이상의 레코드에 대해 실행 중이며 위에 게시 된 두 번째 답변의 이점으로 인해 그 차이가 엄청납니다. 그냥 내 $ 0.02


답변

이것은 minus조작으로 달성 할 수있는 순수한 이론입니다 .

select id, name from table1
minus
select id, name from table2


답변

SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;

여기에 이미지 설명을 입력하십시오

https://www.cloudways.com/blog/how-to-join-two-tables-mysql/


답변

함정에주의하십시오. 필드 NameTable1Null이 포함되어 있으면 놀라게됩니다. 더 낫습니다 :

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT ISNULL(name ,'')
     FROM table1)


답변

다음은 나에게 가장 효과적인 방법입니다.

SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID

이것은 내가 시도한 다른 방법보다 두 배 이상 빠릅니다.