我对高级数据库查询和存储过程比较陌生,我在下面的过程中遇到第三个UPDATE
语句的问题,IF
代码块中的一个。问题是我需要向这些帐户添加成员资格编号,因此UPDATE
的第一次迭代会将lp.ID_1
添加到我的临时表中,而第二次迭代会将lp.ID_2
添加到临时表中。第三次迭代需要从原始INSERT
语句中获取剩余的行(其中ident
仍应为NULL)并将ident
列与ID_1
和{{1}连接起来因为这些帐户都有会员资格。
我在ID_2
区块中尝试了几个条件,但每次似乎都没有达到解决方案。
IF
答案 0 :(得分:2)
我认为整个更新和左连接shebang可以在一个查询中编写而无需任何更新或临时表
;WITH X AS
(
select distinct st.ship2, t.name, null AS ident
from sales_table st
INNER JOIN account_table t ON st.ship2 = t.acct
where st.bill2 = @acct
)
SELECT x.ship2 AS s_acct
,x.name
,COALESCE(ident, lp.ID_2 +', '+ lp.ID_1 , lp.ID_1 , lp.ID_2 , '' ) AS Ident
FROM X
LEFT JOIN lp_table lp ON x.ship2 = lp.acct COLLATE Latin1_General_CS_AS
WHERE COALESCE(ident, lp.ID_2 +', '+ lp.ID_1 , lp.ID_1 , lp.ID_2 , '' ) <> ''
答案 1 :(得分:0)
第二次更新查询无效。第一个更新查询是使用lp_table更新与“acct”匹配的#temp_table行的所有标识值。第二个查询正在查看您刚刚更新的完全相同的行集,其中添加的条件是您只对ident为null的那些行感兴趣....但是在第一步中您确保没有为null。我认为您要做的是确定哪些行未被第一个查询更新,假设某些标识更新为Null。我假设ID_1 \ ID_2中的一些数据为空,因为acct列将始终填充数据。如果我的假设是正确的,您可以执行以下操作:
将您的查询更改为:
create table #temp_table
(
s_acct char(8) null,
name varchar(50) null,
ident varchar(10) null
)
insert into #temp_table
select distinct st.ship2, t.name, null
from sales_table st, account_table t
where st.bill2 = @acct
and st.ship2 = t.acct
update #temp_table
set ident = COALESCE(lp.ID_1, lp.ID_2, 'BOTH LPS ARE NULL?')
from lp_table lp
where #temp_table.s_acct = lp.acct COLLATE Latin1_General_CS_AS
select * from #temp_table
where ident is not null
根据M.Ali的回答,可以改进它以删除任何临时表使用并一次完成。为了完整起见,我把它包括在内。