sql连接复制表a上的值

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

我正试图找出解决问题的办法,但到目前为止还没有成功。
表a:

COMPANY - STORE - CODE
  A        ASG     H       
  A        ASG     S
  A        BSG     S
  A        CSG     H
  A        CSG     S

表b:

COMPANY - STORE - CODE - VALUE
  A        ASG     H      100 
  A        BSG     H      200
  A        CSG     S      100

我需要将表b中的“value”列一次性写入表a,而不需要重复行。如果我使用列“code”连接它们,我只会得到一次写入的值,但是连接有时会失败,正如您在存储“bsg”上注意到的那样,表a上的代码是s,而表b上的代码是h。
我怎样才能从表b中得到只在表a上写一次的值?而且,有时在表b上,代码最终可能是一个s,而表a上的存储只有一个代码h。
有人能帮我吗?
期望输出:

COMPANY - STORE - CODE  - VALUE
  A        ASG     H    - 100    
  A        ASG     S    -  0
  A        BSG     S    - 200
  A        CSG     H    -  0
  A        CSG     S    - 100
8hhllhi2

8hhllhi21#

你可以使用 row_number() :

select a.*,
       (case when row_number() over (partition by a.company, a.store, a.code order by a.company) = 1
             then b.value else 0 end
        end) as value
from a left join
     b
     on a.company = b.company and a.store = b.store and a.code = b.code
order by a.company, a.store, a.code, value desc;
oxcyiej7

oxcyiej72#

ROW_NUMBER() 窗口功能:

select company, store, code, 
       case when rn = 1 then value else 0 end value
from (
  select a.*, b.value,
         row_number() over (partition by a.company, a.store order by a.code = b.code desc) rn
  from TableA a left join TableB b 
  on b.company = a.company and b.store = a.store
) t
order by company, store, code

请看演示。
结果:

> company | store | code | value
> :------ | :---- | :--- | ----:
> A       | ASG   | H    |   100
> A       | ASG   | S    |     0
> A       | BSG   | S    |   200
> A       | CSG   | H    |     0
> A       | CSG   | S    |   100

相关问题