所以这是我的情况。 我有两个包含供应商信息的表(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
非常感谢任何建议!
答案 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%';