当我尝试运行如下查询时:
MERGE INTO
MYTABLE_A
AS MERGE_TARGET
USING
(
SELECT
MYTABLE_A.A, MYTABLE_B.B, MYTABLE_A.C, MYTABLE_D, MYTABLE_E
FROM
MYTABLE_A
INNER JOIN MYTABLE_B
ON MYTABLE_B.A = MYTABLE_A.A
WHERE
MYTABLE_A.LOGIC = 1
AND MYTABLE_B.LOGIC = 2
) AS MERGE_USING
ON MERGE_USING.C = MERGE_TARGET.C
AND MERGE_TARGET.OTHERLOGIC = 1
AND MERGE_TARGET.A IN (
SELECT
MYTABLE_A.A
FROM
MYTABLE_A
INNER JOIN MYTABLE_B
ON MYTABLE_B.A = MYTABLE_A.A
WHERE
MERGE_USING.B = MYTABLE_B.B
)
WHEN MATCHED THEN UPDATE SET
MERGE_TARGET.D = MERGE_USING.D,
MERGE_TARGET.E = MERGE_USING.E
它给了我这个错误:
消息:[SQL0115] 比较运算符 IN 无效。原因 。. . . . : 除了等于和不等于之外的简单比较运算符不能与项目列表一起使用。ANY、ALL 和 SOME 比较运算符后面必须跟一个全查询,而不是表达式或项目列表。不能在 JOIN 条件或 CASE 表达式中指定子查询。恢复 。. . :更改比较或操作数。再次尝试请求。
DB2 版本:V7R1
看起来你在考虑你的合并语句。
该错误告诉您它需要一个相等运算符而不是
IN
. 例如,AND MERGE_TARGET.A IN (
应该是AND MERGE_TARGET.A =
。然后您需要将子查询替换为列名。进一步查看下面的代码部分,我看到您正在尝试查找 merge_target(即 table_a)是否在返回 tableA.A 的子查询中具有值。此外,子查询在同一列 (A) 上将 TableA 连接到 TableB,其中 TableB 也等于 MERGE_USING (TableB) 中的当前行。净效应与
AND MERGE_TARGET.A = MERGE_USING.A
在考虑 MERGE 时,只需将其视为 SIMPLE JOIN 语句。INTO 是 JOIN 的 TABLE 1,USING 是 JOIN 的 TABLE 2,ON 是 JOIN 的内容。现在你有了你的条件,当它匹配或不匹配时你会做什么。
您的 USING 子句中还有一个不需要的连接。Table_A 已经是您的目标。如果我们删除连接并将 WHERE 条件移动到 MERGE 的 ON 部分,我们将得到类似这样的结果......