【问题标题】:Conditional join based on row value基于行值的条件连接
【发布时间】:2021-08-26 09:57:45
【问题描述】:

我有部门映射表,其中我对特定部门具有特定状态,但对于不在部门表中的所有其他部门具有不同的状态。

dep_table:

country department status
FIN D1 C
FIN D2 C
FIN ** O
SWE D1 C

act_table:

country department amt
FIN D1 16
FIN D3 45
SWE D1 13

预期结果:

country department amt status
FIN D1 16 C
FIN D3 45 O
SWE D1 13 C

我有这个,但它会导致重复的行(因为连接 ** 和非 ** 行):

SELECT t1.country, t1.department, t1.amt, t2.status
FROM act_table t1 
  LEFT OUTER JOIN dep_table t2
     ON t1.country = t2.country 
     AND CASE WHEN t1.department = t2.department THEN 1 WHEN t2.department = '**' THEN 1 END = 1 

(这是非常简化的场景 - 需要以这种方式完成。)

【问题讨论】:

  • 你没有明确选择匹配哪一行的逻辑。

标签: sql db2


【解决方案1】:

如果我理解正确,如果任何状态为'O',您需要'O'。如果只有两种状态,可以使用关联子查询:

select a.*,
       (select d.status
        from dep_table d
        where d.country = a.country 
        order by d.status desc
        fetch first 1 row only
       ) as status
from act_table a;

【讨论】:

  • 谢谢,但没有。部门表中有更多的状态和更多的列。我应该指定的。
  • @MichalPalko 。 . .我建议你问一个新问题,更清楚地说明你在做什么。这回答了您在此处提出的问题。
【解决方案2】:

我认为两个左连接更清楚:

with
dep_table (country, department, status) as (
  values
  ('FIN', 'D1', 'C'),
  ('FIN', 'D2', 'C'),
  ('FIN', '**', 'O'),
  ('SWE', 'D1', 'C')
),
act_table (country, department, amt) as (
  values
  ('FIN', 'D2', 16),
  ('FIN', 'D3', 45),
  ('SWE', 'D1', 13)
)
select
  act.country, act.department, act.amt, coalesce(specific.status, rest.status) status
from act_table act
  left join dep_table specific using(country, department)
  left join dep_table rest on specific.status is null and (rest.country, rest.department) = (act.country, '**')
order by country, department

【讨论】:

    【解决方案3】:

    使用 olap 函数 row_number 选择第一行

    select  country ,  department ,  amt ,  status
    from
    (
      select a.country , a.department ,
             a.amt ,  d.status , 
             row_number() over( partition by  a.country , a.department 
                        order by  case when d.department = '**' then 1 else 0 end ) as    rn1 
        from dep_table d ,
        act_table a
        where d.country = a.country
        and   ( d.department = a.department or d.department = '**' )
    ) x 
    where rn1 = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-23
      • 2022-06-23
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多