如何在 IN 子句中使用填充函数的结果?

How to use the result of a stuff-function in an IN-Clause?

我想在 IN 子句中使用串联字符串的结果。

这是我的SQL-查询:

UPDATE Customer
SET Agent = 'Test'
WHERE CAST(ID AS VARCHAR) IN (
        SELECT IIF((
                    SELECT WinnerID
                    FROM Customer
                    WHERE ID = '19560'
                    ) IS NULL, '19560', (
                    SELECT STUFF((
                                SELECT ',' + CAST(ID AS VARCHAR)
                                FROM Customer
                                WHERE WinnerID = '19560'
                                FOR XML PATH('')
                                ), 1, 1, '') --returns 19560, 19686
                    ))
        )

IIF 函数中表达式 returns false 的部分是问题所在。返回了正确的值,但无法正确识别它们,因此 table 未更新。

这是 table 结构,带有一些样本日期

ID 获奖者ID 客户姓名 代理
19560 19560 卡曼桑松
19686 19560 梅拉尼娅·斯诺登
19404 以斯帖弗兰斯堡
19405 马克西莫·席尔
20055 20055 珍妮丝·摩恩
20056 20055 克雷格·罗钦

WinnerID 是重复解析的结果。因此,具有相同 WinnerID 的两个客户是同一客户,应分配相同的代理。

有什么方法可以表达这部分查询以便我可以使用 IN 子句?或者重新制定整个查询以获得预期的结果?

您完全误解了 IN 在这里的工作原理。 ID IN ('19560, 19686') 等同于 ID = '19560, 19686'。使用 IN 时,您需要 return 一个数据集,或提供一个列表。例如 ID IN (19560, 19686).

不需要使用FOR XML PATH不是 STUFFSTUFF所做的只是删除和替换一段字符字符串与另一个字符串;在这种情况下,您要删除第一个字符,并将其替换为零长度字符串)以创建分隔列表,只需正确使用 IN,如 documentation.[= 所示21=]

这是对你想要的逻辑的一些猜测,因为(尊重)它是一团糟,但也许你只是想要这个

UPDATE C
SET Agent = 'Test'
FROM Customer C
WHERE ID = 19560
   OR ID IN (SELECT sq.ID
             FROM Customer sq
             WHERE sq.WinnerID = 19560);