복붙노트

[SQL] SQL 쿼리하지 다른 테이블에 ID와 기록을 찾을 수

SQL

SQL 쿼리하지 다른 테이블에 ID와 기록을 찾을 수

나는 데이터베이스에 기본 키 바인딩을 가진 두 개의 테이블을 가지고 있고 나는 그들 사이의 연결이 끊긴 세트를 찾을 수 원한다. 예를 들어,

내가 표 2에없는 표에서 ID와 행을 가져올 수 있도록 그래서 SQL 쿼리를 작성하는 방법. 이 경우, (3, 메리는) 반환해야합니까?

추신. ID는 두 테이블에 대한 기본 키입니다.

미리 감사드립니다.

해결법

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

    1.이 시도

    이 시도

    SELECT ID, Name 
    FROM   Table1 
    WHERE  ID NOT IN (SELECT ID FROM Table2)
    
  2. ==============================

    2.사용 LEFT는 가입

    사용 LEFT는 가입

    SELECT  a.*
    FROM    table1 a
                LEFT JOIN table2 b
                    on a.ID = b.ID
    WHERE   b.id IS NULL
    
  3. ==============================

    3.나는 ~ 2M 행 각각 두 개의 테이블을 사용하여 (포스트 그레스 9.5에) 몇 가지 테스트를 실행. 아래에이 쿼리는 적어도 5를 수행 * 제안 된 다른 쿼리보다 더 :

    나는 ~ 2M 행 각각 두 개의 테이블을 사용하여 (포스트 그레스 9.5에) 몇 가지 테스트를 실행. 아래에이 쿼리는 적어도 5를 수행 * 제안 된 다른 쿼리보다 더 :

    -- Count
    SELECT count(*) FROM (
        (SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
    ) t1_not_in_t2;
    
    -- Get full row
    SELECT table1.* FROM (
        (SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
    ) t1_not_in_t2 JOIN table1 ON t1_not_in_t2.id=table1.id;
    
  4. ==============================

    4.그 3 가지 기본적인 방법이 있습니다 :하지하지에 존재하고 왼쪽 / 가입 null입니다.

    그 3 가지 기본적인 방법이 있습니다 :하지하지에 존재하고 왼쪽 / 가입 null입니다.

    SELECT  l.*
    FROM    t_left l
    LEFT JOIN
            t_right r
    ON      r.value = l.value
    WHERE   r.value IS NULL
    
    SELECT  l.*
    FROM    t_left l
    WHERE   l.value NOT IN
            (
            SELECT  value
            FROM    t_right r
            )
    
    SELECT  l.*
    FROM    t_left l
    WHERE   NOT EXISTS
            (
            SELECT  NULL
            FROM    t_right r
            WHERE   r.value = l.value
            )
    

    어느 쪽이 더 나은 무엇입니까? 이 질문에 대한 답변이 더 중요한 특정의 RDBMS 벤더로 분류 할 수 있습니다. 일반적으로 하나 ... 선택 사용하지 마십시오해야 말하기 곳 ... (선택 ...) 서브 쿼리의 레코드 수의 크기를 알 수없는 경우입니다. 일부 공급 업체는 크기를 제한 할 수 있습니다. 오라클은, 예를 들어, 1,000의 제한이 있습니다. 할 수있는 가장 좋은 방법은 세 가지를 모두 시도하고 실행 계획을 보여주는 것입니다.

    NOT가 존재 LEFT가 조인 PostgreSQL의 구체적 실행 계획을 형성 / NULL이 동일하다. 나는 개인적으로 더 나은 의도를 보여주고 있기 때문에 NOT 옵션이 존재 선호합니다. 결국 의미 당신은 그것의 PK가 B에 존재하지 않는 A의 기록을 발견 할 것입니다

    올드하지만 여전히 금, PostgreSQL을 특정 비록 : https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/

  5. ==============================

    5.마음에 위 @ 존 우의 코멘트 / 링크에서 만든 점을 유지, 이것이 내가 일반적으로 그것을 처리 할 방법입니다

    마음에 위 @ 존 우의 코멘트 / 링크에서 만든 점을 유지, 이것이 내가 일반적으로 그것을 처리 할 방법입니다

    SELECT t1.ID, t1.Name 
    FROM   Table1 t1
    WHERE  NOT EXISTS (
        SELECT TOP 1 NULL
        FROM Table2 t2
        WHERE t1.ID = t2.ID
    )
    
  6. ==============================

    6.

    SELECT COUNT(ID) FROM tblA a
    WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For count
    
    
    SELECT ID FROM tblA a
    WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For results
    
  7. from https://stackoverflow.com/questions/12048633/sql-query-to-find-record-with-id-not-in-another-table by cc-by-sa and MIT license