代码之家  ›  专栏  ›  技术社区  ›  Igor Ivanov

PL-SQL-一对多关系左连接中的第一条记录

  •  1
  • Igor Ivanov  · 技术社区  · 8 年前

    表A

    code | emp_no
    
    101  | 11111
    102  | 22222
    103  | 33333
    104  | 44444
    105  | 55555
    

    表B

    code | city       | county
    
    101  | City1      | Country1
    101  | City2      | Country1
    101  | City3      | Country1
    102  | City4      | Country2
    103  | City5      | Country3
    

    code | emp_no | city      | county
    
    101  | 11111  | City1     | Country1
    102  | 22222  | City4     | Country2
    103  | 33333  | City5     | Country3
    104  | 44444  | NULL      | NULL
    105  | 55555  | NULL      | NULL
    

    我需要从表B中选择第一条匹配的记录,并忽略所有其他行。

    SELECT *
    FROM TABLE_A a
       LEFT JOIN TABLE_B b ON b.CODE = a.CODE
          AND b.CODE = 
          (
             SELECT CODE
             FROM TABLE_B
             WHERE ROWNUM = 1
          )
    

    但我得到了一个错误:

    我该怎么做?

    谢谢

    3 回复  |  直到 8 年前
        1
  •  6
  •   krokodilko    8 年前

    在Oracle 12c上,您可以使用 OUTER APPLY FETCH FIRST 条款:

    SELECT *
    FROM tableA  a
    OUTER APPLY (
       SELECT * FROM tableB b
       WHERE a.code = b.code
       ORDER BY city, county
       FETCH FIRST ROW ONLY
    )
    
          CODE     EMP_NO       CODE CITY  COUNTY  
    ---------- ---------- ---------- ----- --------
           101      11111        101 City1 Country1
           102      22222        102 City4 Country2
           103      33333        103 City5 Country3
           104      44444                          
           105      55555   
    
        2
  •  5
  •   Alex Poole    8 年前

    min() 聚集函数 the keep (dense_rank first ...) syntax 要从外部联接表中获取“第一个”匹配数据,请执行以下操作:

    select a.code, a.emp_no,
      min(b.city) keep (dense_rank first order by city, county) as city,
      min(b.county) keep (dense_rank first order by city, county) as county
    from table_a a
    left join table_b b on b.code = a.code
    group by a.code, a.emp_no
    order by a.code, a.emp_no;
    
          CODE     EMP_NO CITY  COUNTY  
    ---------- ---------- ----- --------
           101      11111 City1 Country1
           102      22222 City4 Country2
           103      33333 City5 Country3
           104      44444               
           105      55555               
    

    city, county 在keep子句中,您可能有另一个未显示的列,该列应指示顺序。

    可以 按null排序使其具有一定的任意性,但这通常不是一个好主意,尤其是因为以后运行相同的查询可能会对相同的数据产生不同的结果。)

        3
  •  2
  •   Kaushik Nayak    8 年前

    row_number() = 1

    SELECT select a.code,
           a.emp_no,
           b.city,
           b.county
    FROM   table_a a
           left join (SELECT code,
                             city,
                             county,
                             row_number()
                               over (
                                 PARTITION BY code
                                 ORDER BY city, county ) rn
                      FROM   table_b) b
                  ON b.code = a.code
                     WHERE rn = 1 OR rn IS NULL;  
    

    注:从这个问题上看,这实际上意味着什么还不清楚。

    “右”联接表中的第一条记录

    推荐文章