不使用switch case的sql条件操作

7hiiyaii  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(417)

我有两张复杂的table。但它们的Map是这样的:
表a:

_________________________________
|   LINK_ID     |   TYPE_ID     |
_________________________________
| adfasdnf23454 |   TYPE 1      |
| 43fsdfsdcxsh7 |   TYPE 1      |
| dfkng037sdfbd |   TYPE 1      |
| sd09734fdfhsf |   TYPE 2      |
| khsadf94u5dfc |   TYPE 2      |
| piukvih66wfa8 |   TYPE 3      |
_________________________________

表b:

_____________________________________________
|   LINK_ID     |  CODE_ID  | CODE_VALUE    |
_____________________________________________
| adfasdnf23454 |    7      |   test 1      |
| fgubk65esdfj7 |    6      |   test 2      |
| ooogfsg354fds |    7      |   test 3      |
| sd09734fdfhsf |    5      |   test 4      |
_____________________________________________

link\u id列链接这两个表。
我的要求是检查表a中的所有记录是否有特定的代码id。
如果记录的code\ id为7,则在列中填充code\值。
如果记录的code\ id为6,则在另一列中填充code\值。
如果记录没有code\u id,则将code\u值显示为null。
关键是,表\u b可能有表\u a没有的记录。但最终结果应该只包含表a的记录。
ps:不建议使用switch case,因为我需要同一行中的字段(请参阅使用switch case时获得的结果中相同链接的多行(id)
获得的结果:

_______________________________________________
|   LINK_ID     | CODE_VALUE_1 | CODE_VALUE_1 |
_______________________________________________
| adfasdnf23454 |   test 1     |    null      |
| adfasdnf23454 |   null       |    test 4    |
| sd09734fdfhsf |   test 6     |    null      |
_______________________________________________

预期结果:

__________________________________________________
|   LINK_ID     | CODE_VALUE_1  |   CODE_VALUE_2 |
__________________________________________________
| adfasdnf23454 |   test 1      |   test 4       |
| 43fsdfsdcxsh7 |   null        |   null         |
| dfkng037sdfbd |   null        |   null         |
| sd09734fdfhsf |   test 6      |   null         |
| khsadf94u5dfc |   null        |   null         |
| piukvih66wfa8 |   null        |   null         |
__________________________________________________

有人能帮忙吗?

jaxagkaj

jaxagkaj1#

一个选项使用两个相关的子查询:

select
    a.link_id,
    (select code_value from table_b b where b.link_id = a.link_id and b.code_id = 7) code_value_1,
    (select code_value from table_b b where b.link_id = a.link_id and b.code_id = 6) code_value_2
from table_a a

请注意,这假设没有重复 (link_id, code_id)table_b . 你也可以用两个 left join 这是完全相同的逻辑。
另一个解决方案是单一 left join ,然后是条件聚合:

select  
    a.link_id,
    max(case when b.code_id = 7 then b.code_value end) code_value_1,
    max(case when b.code_id = 6 then b.code_value end) code_value_2
from table_a a
left join table_b b on b.link_id = a.link_id and b.code_id in (6, 7)
group by a.link_id
uqxowvwt

uqxowvwt2#

问题的一部分是,如果b中的两个条目具有相同的链接id和类型id,该怎么办。您可以使用min、max和last条目(但为此您需要b中的排序列)。或者您可以列出它们:

select * 
from a left join b using (link_id) 
pivot (listagg(code_value, ', ') within group (order by code_value) 
       for code_id in (6 as code6, 7 as code7))

数据:

create table a (link_id, type_id) as (
  select 'a', 'TYPE 1' from dual union all
  select 'b', 'TYPE 1' from dual union all
  select 'c', 'TYPE 1' from dual union all
  select 'd', 'TYPE 2' from dual );

create table b(LINK_ID, CODE_ID, CODE_VALUE) as (
  select 'a',    6, 'test 1' from dual union all
  select 'a',    7, 'test 2' from dual union all
  select 'a',    7, 'test 3' from dual union all
  select 'b',    7, 'test 4' from dual union all
  select 'd',    6, 'test 5' from dual );

结果:

LINK_ID  TYPE_ID  CODE6     CODE7
a        TYPE 1   test 1    test 2, test 3
b        TYPE 1             test 4
c        TYPE 1
d        TYPE 2   test 5

D小提琴

相关问题