답변:
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
이것은 내가 시도한 다른 방법보다 두 배 이상 빠릅니다.
당신이 사용할 수있는 EXCEPT
MSSQL 또는MINUS
oracle 다음과 같이 동일합니다.
나는 정답으로 다시 게시 할 것입니다 (나는 아직 시원하지 않기 때문에) .... 다른 사람이 더 나은 설명이 필요하다고 생각하는 경우.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
그리고 FROM에서 mySQL의 테이블 이름 사이에 쉼표가 필요한 구문을 보았지만 sqlLite에서는 공백을 선호하는 것 같습니다.
결론은 잘못된 변수 이름을 사용할 때 질문을 남깁니다. 내 변수가 더 합리적이어야합니다. 그리고 누군가 우리에게 쉼표가 필요하거나 쉼표가 필요없는 이유를 설명해야합니다.
특정 사용자를 선택하려면
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
는 tent_npk
사용자의 기본 키