복붙노트

[SQL] SQL과 타의 추종을 불허하는 기록을 찾기

SQL

SQL과 타의 추종을 불허하는 기록을 찾기

나는 다른 테이블에 일치하는 레코드가없는 기록을 찾기 위해 쓰기 a를 쿼리를 시도하고있다.

예를 들어, 나는 누구의 구조를 다음과 같이 뭔가를 보이는 두 개의 테이블이 있습니다

Table1
    State | Product | Distributor | other fields
    CA    | P1      |  A          | xxxx
    OR    | P1      |  A          | xxxx
    OR    | P1      |  B          | xxxx
    OR    | P1      |  X          | xxxx
    WA    | P1      |  X          | xxxx
    VA    | P2      |  A          | xxxx

Table2
    State | Product | Version | other fields
    CA    | P1      |  1.0    | xxxx
    OR    | P1      |  1.5    | xxxx
    WA    | P1      |  1.0    | xxxx
    VA    | P2      |  1.2    | xxxx

(주 / 제품 / 배포자가 함께 표 1. 국가에 대한 키를 형성 / 제품 표 2의 키입니다)

나는 대리점 X를 사용하지 않는 모든 주 / 제품 / 버전 조합을 찾으려면 (이 예제의 결과는 CA-P1-1.0 및 VA-P2-1.2되도록합니다.)

쿼리에 대한 어떤 제안이 작업을 수행하려면?

해결법

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

    1.

    SELECT
        *
    FROM
        Table2 T2
    WHERE
        NOT EXISTS (SELECT *
            FROM
               Table1 T1
            WHERE
               T1.State = T2.State AND
               T1.Product = T2.Product AND
               T1.Distributor = 'X')
    

    이것은 ANSI를 준수해야한다.

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

    2.T-SQL에서 :

    T-SQL에서 :

    SELECT DISTINCT Table2.State, Table2.Product, Table2.Version
    FROM Table2 
      LEFT JOIN Table1 ON Table1.State = Table2.State AND Table1.Product = Table2.Product AND Table1.Distributor = 'X'
    WHERE Table1.Distributor IS NULL
    

    어떤 하위 쿼리가 필요하지 않습니다.

    편집 : 코멘트 표시로, DISTINCT가 필요하지 않습니다. 감사!

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

    3.선택 표에서 * 여기서없는 상태에서 (표에서 선택 상태 어디에 유통 = 'X')

    선택 표에서 * 여기서없는 상태에서 (표에서 선택 상태 어디에 유통 = 'X')

    아마 아닐 가장 영리하지만 그 작동합니다.

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

    4.

    SELECT DISTINCT t2.State, t2.Product, t2.Version
    FROM table2 t2
    JOIN table1 t1 ON t1.State = t2.State AND t1.Product = t2.Product
                    AND t1.Distributor <> 'X'
    
  5. ==============================

    5.오라클의 경우 :

    오라클의 경우 :

    SELECT t2.State, t2.Product, t2.Version
    FROM Table2 t2, Table t1
    WHERE t1.State(+) = t2.State
      AND t1.Product(+) = t2.Product
      AND t1.Distributor(+) = :distributor
      AND t1.State IS NULL
    
  6. from https://stackoverflow.com/questions/508509/finding-unmatched-records-with-sql by cc-by-sa and MIT license