根据条件更新表

时间:2019-07-11 10:46:59

标签: sql sql-server sql-server-2014

我需要根据某些条件更新表中的列。

这是表格-

DGTID |   SKAcc     |      Linkedaccount        |   DGTStatus 
 1      8002180831     8102651144,8005370302          C
 2      8005370302           8002170111               I
 3      8002012348                                    I

因此,对于特定的DGT ID,如果status ='C'并且如果在任何其他SKAcc中存在Linkedaccount,则该SKAcc的DGTStatus也应为C。

让我们说DGTId = 1,它的DGTStatus为'C',并且它的链接帐户='8005370302',这是DGTID ='2'的SKAcc。因此,其DGTStatus也应为'C'

现在,我相信这里的主要部分是提取关联帐户,因为可以有多个逗号分隔的关联帐户。

这就是我写的提取关联帐户的内容-

select  replace(''''+LinkedAccount+'''',',',''',''')  from IDCOPES..T_CDI_WHT_DGT where ISNULL(LinkedAccount,'')<>''

这给了我'8102651144','8005370302'。

然后,我写了-

IF EXISTS (SELECT 1 from IDCOPES..T_CDI_WHT_DGT where DGTID=1 and DGTSTATUS='C')
    UPDATE IDCOPES..T_CDI_WHT_DGT
    SET DGTSTATUS='C' 
    Where SKACC in (select  replace(''''+LinkedAccount+'''',',',''',''')  from IDCOPES..T_CDI_WHT_DGT where ISNULL(LinkedAccount,'')<>'' and DGTID=1) 

但是,这不起作用。 但是,当我写

IF EXISTS (SELECT 1 from IDCOPES..T_CDI_WHT_DGT where DGTID=1 and DGTSTATUS='C')
    UPDATE IDCOPES..T_CDI_WHT_DGT
    SET DGTSTATUS='C' 
    Where SKACC in ('8102651144','8005370302')  

有效。我不明白为什么当两个代码相同时为什么它不起作用。

2 个答案:

答案 0 :(得分:0)

IF EXISTS (SELECT 1 from IDCOPES..T_CDI_WHT_DGT where DGTID=1 and DGTSTATUS='C')
UPDATE IDCOPES..T_CDI_WHT_DGT
SET DGTSTATUS='C' 
 Where SKACC in (
SELECT 
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
FROM
(
SELECT  *,CAST('<XMLRoot><RowData>' + REPLACE(LinkedAccount,',','</RowData> 
<RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM   IDCOPES..T_CDI_WHT_DGT
where LinkedAccount like '%,%'
)t
 CROSS APPLY x.nodes('/XMLRoot/RowData')m(n))

答案 1 :(得分:0)

您可以使用以下更新逻辑-

pigz -dckq dump.sql.gz | \
filt_exclude '%session% action_log %_cache' | \
MYSQL_PWD="my-pass" mysql -u user db_name