Sql 根据两个表中的匹配ID,尝试更新Case

Sql 根据两个表中的匹配ID,尝试更新Case,sql,sql-server,azure-sql-database,Sql,Sql Server,Azure Sql Database,我试图根据名为CW的表中ID的匹配情况,更新名为Price的表中的ID。这是我正在测试的SQL UPDATE Price SET ISN = (case when CW.id_cd = 'ISN' THEN CW.id_number else ISN end), SED = (case when CW.id_cd = 'SED' THEN CW.id_number else SED end), CSP = (case when CW.id_cd = 'CSP'

我试图根据名为CW的表中ID的匹配情况,更新名为Price的表中的ID。这是我正在测试的SQL

UPDATE Price
SET    ISN = (case when CW.id_cd = 'ISN' THEN CW.id_number else ISN end),
       SED = (case when CW.id_cd = 'SED' THEN CW.id_number else SED end),
       CSP = (case when CW.id_cd = 'CSP' THEN CW.id_number else CSP end)
FROM   CW
WHERE  Price.ID_GLOBAL = CW.asset_id
下面是两个模式的屏幕截图。所以,现在黄色单元格中的值缺少ID,但我试图用我在这里显示的值填充它们

奇怪的是,Price表中的大多数id都根据CW表中的相同id进行了很好的更新,但并不是所有id都在更新。在完成上述更新之后,当我运行下面的SQL时,我得到了一堆返回的记录,但我希望没有任何记录,因为所有CSP(ID)都应该在价格表中更新

Select *
From Price
INNER JOIN CW
ON Price.id_global = CW.asset_id
Where Price.CSP IS NUll
AND CW.id_cd = 'CSP'

我想每个
ID\u GLOBAL
CW
中都有多行。问题是只使用了一个匹配的行。解决方案是一系列
左连接或预聚合:

UPDATE Price
    SET ISN = COALESCE(cw.isn, price.isn),
        SED = COALESCE(cw.sed, price.sed),
        CSP = COALESCE(cw.csp, price.csp)
FROM (SELECT asset_id,
             MAX(case when CW.id_cd = 'ISN' THEN CW.id_number END) as ISN,
             MAX(case when CW.id_cd = 'SED' THEN CW.id_number END) as SED,
             MAX(case when CW.id_cd = 'CSP' THEN CW.id_number END) as CSP
      FROM CW
      GROUP BY asset_id
     ) cw
WHERE Price.ID_GLOBAL = CW.asset_id;
注意:这假设新值永远不为
NULL
。如果这是一种可能性,那么分配逻辑需要考虑到这一点。我想这是不必要的

编辑:

分三步进行。对于
“ISN”

UPDATE Price
    SET ISN = cw.isn
FROM CW
WHERE Price.ID_GLOBAL = CW.asset_id AND
      CW.id_cd = 'ISN';

我猜
COALESCE()
是不必要的。

Price.id\u global或CW.asset\u id中是否有导致它们不匹配的尾随空格?听起来不错,但我得到了这个错误。UPDATE和DELETE语句中的FROM子句不能包含子查询源或联接。我可以分三个步骤来完成这项工作吗。这是一个奇怪的SQL Server版本;这是一个Azure SQL数据仓库。SQL Server的某些功能正常工作,有些功能已被剥离。谢谢。我这样做了:设置ISN=cw.id\u编号,然后更新的逻辑工作正常。我最初的尝试有什么问题?为什么这个案子…什么时候…然后…不起作用?是否因为“资产id”和“全球id”不唯一?是吗?谢谢你的帮助!!