Quando tento executar uma consulta como a seguinte:
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
Dá-me este erro:
Mensagem: [SQL0115] O operador de comparação IN não é válido. Causa . . . . . : Operadores de comparação simples diferentes de igual e diferente não podem ser usados com uma lista de itens. Os operadores de comparação ANY, ALL e SOME devem ser seguidos por uma seleção completa, em vez de uma expressão ou uma lista de itens. As subconsultas não podem ser especificadas em uma condição JOIN ou em uma expressão CASE. Recuperação . . . : Altere a comparação ou o operando. Tente a solicitação novamente.
Versão do DB2: V7R1
Parece que você está pensando demais em sua declaração de mesclagem.
O erro está dizendo que está esperando um operador de igualdade em vez de um
IN
. Por exemplo,AND MERGE_TARGET.A IN (
deve serAND MERGE_TARGET.A =
. Então você precisa substituir a subconsulta por um nome de coluna.Olhando para a seção de código abaixo, vejo que você está tentando descobrir se merge_target (que é table_a) tem um valor dentro de uma subconsulta que retorna tableA.A. Além disso, a subconsulta une a TabelaA à TabelaB nesta mesma coluna (A), onde a TabelaB também é igual à linha atual em MERGE_USING (TabelaB). O efeito líquido não é diferente do
AND MERGE_TARGET.A = MERGE_USING.A
Ao pensar em um MERGE, pense nele como uma instrução SIMPLE JOIN. INTO é a TABELA 1 do JOIN, USING é a TABELA 2 do JOIN e ON é o que os une. Agora que você tem sua condição, o que você faz quando combina ou não.
Você também tem junções desnecessárias dentro de sua cláusula USING. Table_A já é seu destino. Se removermos a junção e movermos as condições WHERE para a parte ON do MERGE, terminaremos com algo assim...