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)
답변
두 번째 답변에 투표 할 충분한 담당자 점수가 없습니다. 그러나 나는 최고 답변에 대한 의견에 동의하지 않아야합니다. 두 번째 답변 :
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/
답변
함정에주의하십시오. 필드 Name
에 Table1
Null이 포함되어 있으면 놀라게됩니다. 더 낫습니다 :
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
이것은 내가 시도한 다른 방법보다 두 배 이상 빠릅니다.