3

下面的查询适用于 SQL 服务器。但是在 DB2 中它没有给出结果:

Error is  SQLCODE = -199, ERROR:  ILLEGAL USE OF KEYWORD FROM. 

询问:

UPDATE
     Sales_Import
 SET
    Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON 
SI.LeadID = RAN.LeadID

有人可以澄清 b/w DB2 和 SQL 查询的区别吗?

4

6 回答 6

7

DB2 确实支持在 UPDATE 语句中进行连接,只是不像您想的那样——DB2 遵循 SQL ANSI 标准:

UPDATE
     Sales_Import SI
 SET
    Sales_Import.AccountNumber = (
      SELECT 
        RAN.AccountNumber
      FROM
        RetrieveAccountNumber RAN
      WHERE  
        SI.LeadID = RAN.LeadID
    )

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

编辑:

为了解决下面的评论,如果找不到匹配的记录RetrieveAccountNumberSales_Import.AccountNumber将被设置为空。如果这是不可取的,可以使用COALESCE()分配一个默认值。

于 2014-04-25T11:16:15.523 回答
6

我很确定(虽然我有一段时间没有使用 DB2)DB2 仍然不支持更新语句中的连接,所以您需要使用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
于 2014-04-25T06:01:17.497 回答
1
UPDATE USERS.A A SET A.NAME=(SELECT B.NAME FROM USERS.B B  WHERE A.ID=B.ID );
于 2017-03-22T05:25:52.847 回答
0

If you want to use UPDATE rather than MERGE, you want to process only the matching records where the value will change.

UPDATE Sales_Import SI
  SET SI.AccountNumber = 
        (SELECT RAN.AccountNumber
           FROM RetrieveAccountNumber RAN
           WHERE SI.LeadID = RAN.LeadID
           FETCH FIRST ROW ONLY
        )
  WHERE SI.LeadID IN
        (SELECT S2.LeadID
           FROM Sales_Import S2
           JOIN RetrieveAccountNumber R2
             ON S2.LeadID = R2.LeadID
           WHERE S2.AccountNumber <> R2.RetrieveAccountNumber 
        )
于 2014-04-29T14:24:24.820 回答
0

回答你的问题

UPDATE Sales_Import f1
SET f1.AccountNumber = 
(
 SELECT f2.AccountNumber
 FROM RetrieveAccountNumber f2
 WHERE f1.LeadID = f2.LeadID
 FETCH FIRST ROW ONLY
)
WHERE exists
(
SELECT * FROM RetrieveAccountNumber f2
 WHERE f1.LeadID = f2.LeadID 
)

模板法

update table1 f1
set (f1.field1, f1.field2, f1.field3, f1.field4)=
(
select f2.field1, f2.field2, f2.field3, 'CONSTVALUE'
from table2 f2
where (f1.key1, f1.key2)=(f2.key1, f2.key2) 
)
where exists 
(
select * from table2 f2
where (f1.key1, f1.key2)=(f2.key1, f2.key2)
)   
于 2016-11-15T18:54:02.240 回答
0

如果其他人想用 DB2 上另一个表的值的 SUM() 更新表。我在连接方面遇到了很多问题,最后在 UPDATE 中的一个简单的 SELECT 解决了它。谢谢@mustaccio

TABLE_A
ID......|TOTAL...|...
1
5
6

TABLE_B
ID......|REF_ID...|QUANTITY|...
1        5         20
2        1         25
3        1         3
SQL Statement:  
UPDATE TABLE_A ta
SET ta.TOTAL = (
    SELECT SUM(tb.QUANTITY)
    FROM TABLE_B tb
    WHERE tb.REF_ID = ta.ID
)
RESULT
TABLE_A
ID......|TOTAL...|...
1        28
5        20
6        NULL
于 2019-05-28T14:33:52.690 回答