为the UPDATE statement对DB2 LUW 9.7的参考文档给出了下面的例子:
UPDATE (SELECT EMPNO, SALARY, COMM,
AVG(SALARY) OVER (PARTITION BY WORKDEPT),
AVG(COMM) OVER (PARTITION BY WORKDEPT)
FROM EMPLOYEE E) AS E(EMPNO, SALARY, COMM, AVGSAL, AVGCOMM)
SET (SALARY, COMM) = (AVGSAL, AVGCOMM)
WHERE EMPNO = '000120'
更新后的括号中可以包含全选,这意味着任何有效的SELECT语句可以去那里。
此基础上,我建议如下:
UPDATE (
SELECT
f1.firstfield,
f2.anotherfield,
f2.something
FROM file1 f1
WHERE f1.firstfield like 'BLAH%'
INNER JOIN file2 f2
ON substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
)
AS my_files(firstfield, anotherfield, something)
SET
firstfield = ('BIT OF TEXT' || something)
编辑:伊恩是正确的。我的第一个直觉是尝试子选择,而不是:
UPDATE file1 f1
SET f1.firstfield = ('BIT OF TEXT' || (
SELECT f2.something
FROM file2 f2
WHERE substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
))
WHERE f1.firstfield LIKE 'BLAH%'
AND substr(f1.firstfield,10,20) IN (
SELECT substr(f2.anotherfield,1,10)
FROM file2 f2
)
但我不知道如果串联工作。它还假定在子串之间有1:1映射。如果有多个匹配的行,它将无法工作。
谢谢ConcernedOfTunbridge - 可惜在DB2这并不工作,我得到一个错误说“列资格赛或表B中未定义” – Hamish 2010-11-15 12:28:13
任何其他想法? – Hamish 2010-11-15 12:28:35
你有没有试过||而不是+,而你想输入内部连接而不是'连接' - 我认为substr函数应该是'10,10'而不是'10,20'请参见http://publib.boulder.ibm.com/infocenter/ db2luw/v8/index.jsp?topic =/com.ibm.db2.udb.doc/admin/r0000854.htm – 2010-11-16 00:04:43