基于ID匹配IN db2从一个表到另一个表的SQL更新

Age*_*one 3 db2 correlated-subquery sql-update db2-luw

下面的查询适用于SQL sErver.但在DB2中它没有给出结果:

Error is  SQLCODE = -199, ERROR:  ILLEGAL USE OF KEYWORD FROM. 
Run Code Online (Sandbox Code Playgroud)

查询:

UPDATE
     Sales_Import
 SET
    Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON 
SI.LeadID = RAN.LeadID
Run Code Online (Sandbox Code Playgroud)

有人可以澄清b/w DB2和SQL查询的差异.

mus*_*cio 6

DB2确实支持UPDATE语句中的连接,而不是您认为的方式 - DB2遵循SQL ANSI标准:

UPDATE
     Sales_Import SI
 SET
    Sales_Import.AccountNumber = (
      SELECT 
        RAN.AccountNumber
      FROM
        RetrieveAccountNumber RAN
      WHERE  
        SI.LeadID = RAN.LeadID
    )
Run Code Online (Sandbox Code Playgroud)

以上假设LeadID唯一标识记录RetrieveAccountNumber,否则您将收到错误,因为子查询将返回多行.

编辑:

要解决以下注释,如果找不到匹配的记录RetrieveAccountNumber,Sales_Import.AccountNumber则将其设置为null.如果这是不合需要的,可以使用COALESCE()分配默认值.


Joa*_*son 5

我非常确定(尽管我已经有一段时间没有使用DB2了)DB2仍然不支持update语句中的联接,因此您需要使用MERGE

像这样的东西(徒劳地使用它,因为我没有可用的DB2,所以可能会略有不足);

MERGE INTO Sales_Import si
USING (SELECT AccountNumber, LeadID FROM RetrieveAccountNumber) ra
ON (si.LeadID = ra.LeadID)
WHEN MATCHED THEN
 UPDATE SET AccountNumber = ra.AccountNumber
Run Code Online (Sandbox Code Playgroud)