복붙노트

[SQL] 어떻게 다른 테이블에 존재하지 않는 한 테이블의 모든 레코드를 선택하려면?

SQL

어떻게 다른 테이블에 존재하지 않는 한 테이블의 모든 레코드를 선택하려면?

질문:

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

해결법

  1. ==============================

    1.

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

    Q : 여기 무슨 일?

    A : 개념적으로, 우리는 표에서 모든 행을 선택하고 각 행에 대해 우리는 이름 컬럼에 대해 동일한 값을 표 2에있는 행을 찾기 위해 시도합니다. 그러한 행이없는 경우, 우리는 우리의 결과를 표 2 부분이 해당 행 비워 둡니다. 그럼 우리가 일치하는 행이 존재하지 않는 결과에서 행만을 선택하여 우리의 선택을 제한. 마지막으로, 우리는 이름 열 (표 1에서 우리의 존재를 확신 하나,)를 제외하고 우리의 결과에서 모든 필드를 무시합니다.

    이 모든 경우에 가장 성능이 좋은 방법이 가능하지 않을 수 있지만, 그것은 시도 ANSI 92 SQL을 구현하기 위해 어느 것을 기본적으로 모든 데이터베이스 엔진에서 작동합니다

  2. ==============================

    2.당신도 할 수있다

    당신도 할 수있다

    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 개 기술은 이러한 목표를 달성하기 위해이 질문을 참조

  3. ==============================

    3.나는 2 대답을 투표를하기에 충분한 담당자 포인트가 없습니다. 하지만 상단의 대답에 의견에 동의해야합니다. 두 번째 답 :

    나는 2 대답을 투표를하기에 충분한 담당자 포인트가 없습니다. 하지만 상단의 대답에 의견에 동의해야합니다. 두 번째 답 :

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

    훨씬 더 효율적인 연습입니다. 왜 그런지 모르겠지만, 800K + 기록에 대해 그것을 실행하고있어 차이가 2 대답에 주어진 장점은 위의 게시와 함께 엄청난입니다. 그냥 내 $ 0.02

  4. ==============================

    4.이것은 당신이 마이너스 작동을 달성 할 수있는 순수한 집합 이론이다.

    이것은 당신이 마이너스 작동을 달성 할 수있는 순수한 집합 이론이다.

    select id, name from table1
    minus
    select id, name from table2
    
  5. ==============================

    5.

    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/

  6. ==============================

    6.함정을 조심. 표에서 필드 이름이 널 (null)를 포함하는 경우에 당신은 놀라움에에 있습니다. 더 나은입니다 :

    함정을 조심. 표에서 필드 이름이 널 (null)를 포함하는 경우에 당신은 놀라움에에 있습니다. 더 나은입니다 :

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

    7.다음은 나에게 가장 일거야.

    다음은 나에게 가장 일거야.

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

    이 두 배 빠른 속도로 내가 노력 다른 방법으로 이상이었다.

  8. ==============================

    8.당신은 오라클에서 MSSQL 또는 MINUS를 제외하고 사용할 수 있습니다, 그들은 동일한있어서,로이다 :

    당신은 오라클에서 MSSQL 또는 MINUS를 제외하고 사용할 수 있습니다, 그들은 동일한있어서,로이다 :

    http://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-oracle/

  9. ==============================

    9.나를 위해 날카로운 그 작업

    나를 위해 날카로운 그 작업

    SELECT * 
    FROM [dbo].[table1] t1
    LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
    WHERE t2.[t2_ID] IS NULL
    
  10. ==============================

    10.나는 다른 더 나은 설명 필요하다고 생각하는 경우 누군가에 ... (내가 코멘트에 아직 충분히 냉각 아니에요 이후) 정답에 다시 게시하겠습니다.

    나는 다른 더 나은 설명 필요하다고 생각하는 경우 누군가에 ... (내가 코멘트에 아직 충분히 냉각 아니에요 이후) 정답에 다시 게시하겠습니다.

    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
    

    그리고 MySQL의 테이블 이름 사이에 쉼표를 필요로에서 구문을 본 적이 있지만 sqlLite에이 공간을 택한 것으로 보였습니다.

    당신이 질문에 잎 나쁜 변수 이름을 사용하는 경우 결론입니다. 내 변수는 더 의미를해야한다. 우리는 쉼표 또는 전혀 쉼표가 필요한 이유 그리고 누군가가 설명해야한다.

  11. ==============================

    11.쿼리를 참조하십시오 :

    쿼리를 참조하십시오 :

    SELECT * FROM Table1 WHERE
    id NOT IN (SELECT 
            e.id
        FROM
            Table1 e
                INNER JOIN
            Table2 s ON e.id = s.id);
    

    개념적으로는 다음과 같습니다 서브 쿼리에없는 레코드를 가져 오는 주요 쿼리에서 다음 일치하는 하위 쿼리의 기록과를 가져오고 있습니다.

  12. from https://stackoverflow.com/questions/2686254/how-to-select-all-records-from-one-table-that-do-not-exist-in-another-table by cc-by-sa and MIT license