【问题标题】:Left Outer Join with Unique Set of Rows具有唯一行集的左外连接
【发布时间】:2020-09-22 07:03:54
【问题描述】:

我有一个表 A 有两个字段

SETID   SEL_GROUP
KICAE   AA_01DBA
KICAE   AA_02DHM
KICAE   AA_03DML
KICAE   AA_03DMO
KICAE   AA_05CAO
KICAE   AA_05CGA

另一个包含两个字段的表

SETID  COURSELIST
KICAE   110011000
KICAE   110011200
KICAE   110011500
KICAE   110011530
KICAE   110021000
KICAE   110021200
KICAE   110021500
KICAE   110021530

................

在表二中,CourseList 的最后 4 个字符从位置 3 到位置 5 依次重复。

我希望输出是

SETID  SEL_GROUP   COURSE_LIST
KICAE   AA_01DBA   110011000
KICAE   AA_01DBA   110011200
KICAE   AA_01DBA   110011500
KICAE   AA_01DBA   110011530
KICAE   AA_02DHM   110021000    ---------The Sequence Changes When the SEL_GROUP Changes
KICAE   AA_02DHM   110021200
KICAE   AA_02DHM   110021500
KICAE   AA_02DHM   110021530

【问题讨论】:

  • 第一个表中的其他六行呢?

标签: sql oracle join window-functions


【解决方案1】:

你可以使用窗口函数:

select a.setid, a.sel_group, b.courselist
from (
    select a.*, row_number() over(partition by setid order by sel_group) rn
    from a
) a
inner join (
    select b.*, dense_rank() over(partition by setid order by substr(course_list, 1, 6)) rn
    from b
) b on a.setid = b.setid and a.rn = b.rn

第一个子查询按顺序排列具有相同setid 的记录。第二个子查询为具有相同setidcourse_list 的前6 个字符相同的记录分配相同的排名。然后你可以join这两个结果集得到你想要的结果。

Demo on DB Fiddle

SETID | SEL_GROUP |课程表 :---- | :-------- | ---------: KICAE | AA_01DBA | 110011000 KICAE | AA_01DBA | 110011200 KICAE | AA_01DBA | 110011500 KICAE | AA_01DBA | 110011530 KICAE | AA_02DHM | 110021000 KICAE | AA_02DHM | 110021200 KICAE | AA_02DHM | 110021500 KICAE | AA_02DHM | 110021530

【讨论】:

    【解决方案2】:

    你似乎想要这样的东西:

    select t2.setid, t1.sel_group, t2.courselist
    from (select t2.*,
                 dense_rank() over (partition by setid order by substr(courselist, 1, 5)) as seqnum
          from table2 t2
         ) t2 join
         (select t1.*, row_number() over (partition by setid order by sel_group) as seqnum
          from table1 t1
         ) t1
         on t2.seqnum = t1.seqnum and t2.setid = t1.setid;
    

    这将根据课程列表中的前五个字符枚举table2 中的组。然后枚举table1 中的行并将其用于连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2018-01-16
      • 2015-03-11
      相关资源
      最近更新 更多