한 테이블에서 다른 테이블에 존재하지 않는 모든 레코드를 선택하는 방법은 무엇입니까?
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/
함정에주의하십시오. 필드 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 *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
나는 정답으로 다시 게시 할 것입니다 (나는 아직 냉담하지 않기 때문에). 다른 사람이 더 나은 설명이 필요하다고 생각하는 경우.
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 * FROM Table1 WHERE
id NOT IN (SELECT
e.id
FROM
Table1 e
INNER JOIN
Table2 s ON e.id = s.id);
개념적으로는 : 하위 쿼리에서 일치하는 레코드를 가져온 다음 기본 쿼리에서 하위 쿼리에없는 레코드를 가져옵니다.
'Programming' 카테고리의 다른 글
반복하는 동안 일반 목록에서 요소를 제거하는 방법은 무엇입니까? (0) | 2020.02.20 |
---|---|
JavaScript에서 선행 0으로 숫자 채우기 (0) | 2020.02.20 |
VS 2012 : 솔루션 탐색기를 현재 파일로 스크롤 (0) | 2020.02.20 |
Laravel 5의 맞춤형 헬퍼를위한 모범 사례 (0) | 2020.02.20 |
LDAP와 Active Directory의 차이점은 무엇입니까? (0) | 2020.02.19 |