обновить таблицу на основе условия - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно обновить столбец в таблице на основании некоторого условия.

вот таблица -

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

Таким образом, для конкретного идентификатора DGT, если status = 'C' и если Linkedaccount присутствует в любом другом SKAcc, то DGTStatus для этого SKAcc также должен быть C.

Допустим, DGTId = 1, он имеет DGTStatus в виде 'C' и имеет связанный счет = '8005370302', который представляет собой SKAcc для DGTID = '2'. Таким образом, его 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 голосов
/ 11 июля 2019

Вы можете использовать логику обновления, как показано ниже -

DECLARE @TempTable TABLE(
    DGTID INT,
    SKAcc VARCHAR(MAX),
    Linkedaccount VARCHAR(MAX),
    DGTStatus VARCHAR(1)
)

INSERT INTO @TempTable (DGTID,SKAcc,Linkedaccount,DGTStatus)
VALUES( 1,'8002180831','8102651144,8005370302','C' ),
( 2,'8005370302','8002170111','I'),
( 3,'8002012348',NULL,'I' )

SELECT * FROM @TempTable

UPDATE A
SET A.DGTStatus = 'C'
FROM @TempTable A
INNER JOIN @TempTable B ON B.Linkedaccount LIKE '%'+CAST(A.SKAcc AS VARCHAR(MAX))+'%'
AND  B.DGTStatus = 'C'

SELECT * FROM @TempTable
0 голосов
/ 11 июля 2019
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))
...