Programming

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

procodes 2020. 2. 20. 23:36
반응형

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


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

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


EXCEPTmssql 또는 MINUSoracle 에서 사용할 수 있으며 다음과 같이 동일합니다.

http://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-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);

개념적으로는 : 하위 쿼리에서 일치하는 레코드를 가져온 다음 기본 쿼리에서 하위 쿼리에없는 레코드를 가져옵니다.

참고 URL : https://stackoverflow.com/questions/2686254/how-to-select-all-records-from-one-table-that-do-not-exist-in-another-table



반응형