【问题标题】:Oracle 12C SQL - Populate missing results with JoinsOracle 12C SQL - 使用联接填充缺失的结果
【发布时间】:2020-12-06 10:32:03
【问题描述】:

我有以下数据表(例如简化)

TEAM    WORKS   TT
TEAM_A  JOB_1   10
TEAM_A  JOB_3   20
TEAM_B  JOB_2   30

我希望得到以下结果

TEAM    WORKS   TT
TEAM_A  JOB_1   10
TEAM_A  JOB_2   NULL
TEAM_A  JOB_3   20
TEAM_B  JOB_1   NULL
TEAM_B  JOB_2   30
TEAM_B  JOB_3   NULL

这个结果表需要为每个团队添加原始数据集中没有出现的工作类型,并给出时间值NULL

我尝试了以下 SQL,并尝试了许多连接类型,但始终无法获得我想要的结果。

WITH BASE AS (
            SELECT 'TEAM_A' AS TEAM, 'JOB_1' AS WORKS, 10 AS TT FROM DUAL
UNION ALL   SELECT 'TEAM_A' AS TEAM, 'JOB_3' AS WORKS, 20 AS TT FROM DUAL
UNION ALL   SELECT 'TEAM_B' AS TEAM, 'JOB_2' AS WORKS, 30 AS TT FROM DUAL
)
SELECT
        BASE.TEAM
    ,   BASE.WORKS
    ,   BASE.TT
FROM BASE
FULL OUTER JOIN (
                SELECT 'JOB_1' AS WORKS FROM DUAL
    UNION ALL   SELECT 'JOB_2' AS WORKS FROM DUAL
    UNION ALL   SELECT 'JOB_3' AS WORKS FROM DUAL
) WORK_TYPES ON BASE.WORKS = WORK_TYPES.WORKS
;

【问题讨论】:

  • 交叉加入团队和工作价值观。外部联接。
  • jarlh,你有例子吗?当我交叉加入时,它仍然给我不正确的结果。
  • partitioned outer join 正是为此类任务而创建的。

标签: sql oracle join left-join oracle12c


【解决方案1】:

您可以交叉加入不同的团队和作品,然后带上left join

select te.team, wo.work, ta.tt
from (select distinct team from mytable) te
cross join (select distinct work from mytable) wo
left join mytable ta
    on ta.team = te.team and ta.work = wo.work
order by te.team, wo.work

【讨论】:

    【解决方案2】:

    显而易见的解决方案是使用partitioned outer join,这正是你的问题:

    WITH BASE AS (
                SELECT 'TEAM_A' AS TEAM, 'JOB_1' AS WORKS, 10 AS TT FROM DUAL
    UNION ALL   SELECT 'TEAM_A' AS TEAM, 'JOB_3' AS WORKS, 20 AS TT FROM DUAL
    UNION ALL   SELECT 'TEAM_B' AS TEAM, 'JOB_2' AS WORKS, 30 AS TT FROM DUAL
    )
    SELECT
            BASE.TEAM
        ,   WORK_TYPES.WORKS
        ,   BASE.TT
    FROM (
                          SELECT 'JOB_1' AS WORKS FROM DUAL
              UNION ALL   SELECT 'JOB_2' AS WORKS FROM DUAL
              UNION ALL   SELECT 'JOB_3' AS WORKS FROM DUAL
         ) WORK_TYPES 
         left JOIN BASE
         partition by (base.team)
         ON BASE.WORKS = WORK_TYPES.WORKS
    ;
    

    结果:

    TEAM   WORKS         TT
    ------ ----- ----------
    TEAM_A JOB_1         10
    TEAM_A JOB_2
    TEAM_A JOB_3         20
    TEAM_B JOB_1
    TEAM_B JOB_2         30
    TEAM_B JOB_3
    

    【讨论】:

      猜你喜欢
      • 2019-11-18
      • 2016-10-05
      • 1970-01-01
      • 2022-01-12
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多