복붙노트

[SQL] 왼쪽에 참여 이용한 1 대 다수의 관계에서 첫 번째 레코드를 선택

SQL

왼쪽에 참여 이용한 1 대 다수의 관계에서 첫 번째 레코드를 선택

나는 왼쪽 조인을 사용하여 두 개의 테이블을 조인하기 위해 노력하고있어. 그리고 결과 집합은 "오른쪽"조인 된 테이블에서 첫 번째 기록을 포함한다.

나는 다음과 같이 두 테이블 A와 B가 있다고 가정하자;

표 "A"

code | emp_no

101  | 12222
102  | 23333
103  | 34444
104  | 45555
105  | 56666

표 "B"

code | city       | county
101  | Glen Oaks  | Queens
101  | Astoria    | Queens
101  | Flushing   | Queens
102  | Ridgewood  | Brooklyn
103  | Bayside    | New York

예상 출력 :

code | emp_no | city      | county
101  | 12222  | Glen Oaks | Queens
102  | 23333  | Ridgewood | Brooklyn
103  | 34444  | Bayside   | New York
104  | 45555  | NULL      | NULL
105  | 56666  | NULL      | NULL

내 결과가 표 "B"에서 오직 하나 개 일치하는 기록을 가지고 통지 (문제 기록이 일치 무엇을하지 않습니다) 떠난 후 가입 (그리고 많은 매핑에 하나) 경우

나는 테이블 B에서 첫 번째 일치하는 기록을 선택해야하고 다른 모든 행을 무시합니다.

도와주세요!

감사

해결법

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

    1.내가 기대했던 것보다 조금 장난 후, 밖으로이 회전은 난이도가 될 수 있습니다! 그 table_b 가정하면 (단일 필드 기본 키 말) 고유 어떤 하나의 컬럼을 가지고 당신이 할 수있는 것처럼, 그것은 본다 :

    내가 기대했던 것보다 조금 장난 후, 밖으로이 회전은 난이도가 될 수 있습니다! 그 table_b 가정하면 (단일 필드 기본 키 말) 고유 어떤 하나의 컬럼을 가지고 당신이 할 수있는 것처럼, 그것은 본다 :

    SELECT table_a.code,
           table_a.emp_no,
           table_b.city,
           table_b.county
      FROM table_a
      LEFT
      JOIN table_b
        ON table_b.code = table_a.code
       AND table_b.field_that_is_unique =
            ( SELECT TOP 1
                     field_that_is_unique
                FROM table_b
               WHERE table_b.code = table_a.code
           )
    ;
    
  2. ==============================

    2.데이터베이스에서 지원하는 경우, OUTER 적용을 효율적이고 간결 옵션입니다.

    데이터베이스에서 지원하는 경우, OUTER 적용을 효율적이고 간결 옵션입니다.

    SELECT *
    FROM 
        Table_A a
    OUTER APPLY
        (SELECT TOP 1 * 
        FROM Table_B b_1
        WHERE b_1.code = a.code
        ) b
    ;
    

    왼쪽에있는이 결과는 불확정 첫번째 일치하는 기록에 가입 할 수 있습니다. 내 테스트는 (MS SQL 서버 2012) 다른 게시 된 솔루션보다 빠른 것으로 보여.

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

    3.가장 높은 투표 대답은하지 나에게 올바른 것 수행하고 overcomplicated 보인다. 귀하의 하위 쿼리에서 테이블 B의 코드 필드에 의해 그냥 그룹과 그룹화 당 최대 ID를 선택합니다.

    가장 높은 투표 대답은하지 나에게 올바른 것 수행하고 overcomplicated 보인다. 귀하의 하위 쿼리에서 테이블 B의 코드 필드에 의해 그냥 그룹과 그룹화 당 최대 ID를 선택합니다.

    SELECT 
        table_a.code,
        table_a.emp_no,
        table_b.city,
        table_b.county
    FROM 
        table_a
        LEFT JOIN 
            table_b
            ON table_b.code = table_a.code
            AND table_b.field_that_is_unique IN
                (SELECT MAX(field_that_is_unique)
                 FROM table_b
                 GROUP BY table_b.code)
    
  4. ==============================

    4.당신은 SQL Server 2005 또는 이후 버전에있는 경우, 당신은 당신이 원하는 것을 달성하기 위해 순위를 사용할 수 있습니다. 특히, ROW_NUMBER ()는 잘 필요에 맞게 같다 :

    당신은 SQL Server 2005 또는 이후 버전에있는 경우, 당신은 당신이 원하는 것을 달성하기 위해 순위를 사용할 수 있습니다. 특히, ROW_NUMBER ()는 잘 필요에 맞게 같다 :

    WITH B_ranked AS (
      SELECT
        *,
        rnk = ROW_NUMBER() OVER (PARTITION BY code ORDER BY city)
      FROM B
    )
    SELECT
      A.code,
      A.emp_no,
      B.city,
      B.county
    FROM A
      LEFT JOIN B_ranked AS B ON A.code = B.code AND b.rnk = 1
    

    또는

    WITH B_unique_code AS (
      select * from(
         SELECT
          *,
          rnk = ROW_NUMBER() OVER (PARTITION BY code ORDER BY city)
          FROM B
         ) AS s
      where rnk = 1
    )
    SELECT
      A.code,
      A.emp_no,
      B.city,
      B.county
    FROM A
      LEFT JOIN B_unique_code AS B ON A.code = B.code
    
  5. ==============================

    5.나는 ruakh에서 답을 수정이 MySQL과 완벽하게 작동하는 것 같다.

    나는 ruakh에서 답을 수정이 MySQL과 완벽하게 작동하는 것 같다.

    SELECT 
       table_a.code,
       table_a.emp_no,
       table_b.city,
       table_b.county
    FROM table_a a
    LEFT JOIN table_b b
    ON b.code = a.code 
    AND b.id = (  SELECT id FROM table_b 
                  WHERE table_b.code = table_a.code 
                  LIMIT 1
               )
    ;
    
  6. ==============================

    6.오라클에서 당신은 할 수 있습니다 :

    오라클에서 당신은 할 수 있습니다 :

    WITH first_b AS (SELECT code, min(rowid) AS rid FROM b GROUP BY code)) 
    SELECT a.code, a.emp_no, b.city, b.county
    FROM a 
    INNER JOIN first_b 
     ON first_b.code = a.code
    INNER JOIN b
     ON b.rowid = first_b.rid
    
  7. ==============================

    7.이 방법은 다음과 같습니다

    이 방법은 다음과 같습니다

     Select * From TableA a
         Left Join TableB b
             On b.Code = a.Code 
                 And [Here put criteria predicate that 'defines' what the first record is]
    

    도시와 카운티가 고유 이봐, 다음,이를 사용

       Select * From TableA a
         Left Join TableB b
             On b.Code = a.Code 
                 And b.City + b.county =
                      (Select Min(city + county)
                       From TableB 
                       Where Code = b.Code)
    

    그러나 요점은 당신이 먼저 무엇을 의미하는지 쿼리 프로세서에게 거기에 몇 가지 표현을 넣어야 할 것입니다.

  8. from https://stackoverflow.com/questions/8161438/select-first-record-in-a-one-to-many-relation-using-left-join by cc-by-sa and MIT license