SQL将多个表和行的结果合并到一个表中的一行中

时间:2014-05-28 17:46:52

标签: sql

所以这是我的情况。 我有两个包含供应商信息的表(keysetdata115)和包含汇款或付款地址的keysetdata117。

以下是包含一个样本条目的结构: keysetdata115:

keysetnum   ks183   ks178   ks184                    ks185       ks187  usagecount
2160826     1       6934    AUDIO DIGEST FOUNDATION  26-1180877  A      0

keysetdata117(我截断了ks192和ks191的值以适应格式化)

keysetnum   ks183   ks178   ks188   ks189   ks190     ks192     ks191   usagecount
2160827     1       6934    P001    P       EBSCO...  TOP OF... A       0
2160828     1       6934    R002    R       EBSCO...  123 SE... A       0

没有1:1的关系,唯一创建唯一记录的是组合或汇款代码,付款代码,供应商编号和供应商组。只能通过引用地址和/或名称来获取代码。

理想情况下,我想要做的是设置它,以便我可以传入地址并返回所有相关值。

我现在把它放在一个名为'dbo.test'的表中(显然是为了测试),它具有以下条目以及上表中对应的内容:vengroup(ks183),vendnum(ks178),汇款(ks188),付款(ks188)... ks188将根据ks189的值进行汇款或付款。

这是我到目前为止所做的,使用3个选择查询并且它可以工作,但是存在大量冗余并且效率非常低。

关于如何简化它的任何建议都会非常感激。

insert into dbo.test (vengroup,vendnum)
  select ks183, ks178
  from hsi.keysetdata115
  where ks184 like 'AUDIO DIGEST%'

update dbo.test
set dbo.test.remit = y.remit
from
dbo.test tst
INNER JOIN
    (Select ksd.ks188 as remit, ksd.ks183 as vengroup, ksd.ks178 as vendnum
    from hsi.keysetdata117 ksd
    inner join dbo.test tst
        on tst.vengroup = ksd.ks183 and tst.vendnum = ksd.ks178
    where ksd.ks190 like 'EBSCO%' and ks189 = 'R') y
on tst.vengroup = y.vengroup and tst.vendnum = y.vendnum


update dbo.test
set dbo.test.payment = y.payment
from
dbo.test tst
INNER JOIN
    (Select ksd.ks188 as payment, ksd.ks183 as vengroup, ksd.ks178 as vendnum
    from hsi.keysetdata117 ksd
    inner join dbo.test tst
        on tst.vengroup = ksd.ks183 and tst.vendnum = ksd.ks178
    where ksd.ks190 like 'EBSCO%' and ks189 = 'P') y
on tst.vengroup = y.vengroup and tst.vendnum = y.vendnum  

非常感谢任何建议!

1 个答案:

答案 0 :(得分:1)

你可以在一个声明中做你想做的事。你只需要在奔跑中做出选择。写下面的陈述的方式,如果Remit得到值,则Payment获得null,反之亦然。如果您希望其他值为非null,只需向else添加case子句即可。与then b.ks188 else 0 end一样。

INSERT INTO dbo.TEST( vengroup, vendnum, remit, payment )
  SELECT  a.ks183, a.ks178, 
          CASE b.ks189 WHEN 'R' THEN b.ks188 END, 
          CASE b.ks189 WHEN 'P' THEN b.ks188 END 
  FROM  keysetdata115 a
  JOIN  keysetdata117 b
    ON  b.ks183 = a.ks183
    AND b.ks178 = a.ks178
    AND b.ks190 LIKE 'EBSCO%' 
  WHERE a.ks184 LIKE 'AUDIO DIGEST%';