es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualizar otra tabla usando la salida de CTE en Teradata

Tecnología: Teradata 16.20

Estoy intentando actualizar una tabla que toma datos de otra tabla que utiliza datos CTE.

Estoy obteniendo el siguiente error:

Error:

select failed 3707 syntax error, expected something like a ‘SELECT’ keyword or ‘(‘ or a ‘TRANSACTIONTIME’ keyword or a ‘VALIDTIME’ keyword between ‘)’ and the ‘UPDATE’ keyword

Pregunta:
¿Es posible actualizar una tabla utilizando otra tabla que se une con CTE?

Sé que se puede hacer con una tabla volátil. He visto CTE con declaraciones de inserción y con declaraciones de selección, pero nunca he visto CTE con una declaración de actualización. Escribir el mismo SQL una y otra vez para varias uniones propias solo aumenta las líneas de código. Si esta actualización se puede hacer utilizando CTE, sería mucho más fácil y comprensible.

Código:

WITH NAME_CTE AS (
SELECT FIRST.ID,FIRST.NAM,LAST.NAME
FROM TABLE_FIRST FIRST INNER JOIN TABLE_LAST LAST
ON FIRST.ID = LAST.ID
)
UPDATE SUBJECT_TEACHER_TABLE
FROM (
SELECT CROSS_TBL.SUB_ID,
COALESCE(CTE1.NAM,CTE1.NAME,CTE2.NAM,CTE2.NAME) AS FINAL_NAME
FROM CROSS_REFERENCE_TABLE CROSS_TBL
LEFT JOIN NAME_CTE CTE1 ON CROSS_TBL.CR_ID1 = CTE.ID
LEFT JOIN NAME_CTE CTE2 ON CROSS_TBL.CR_ID2 = CTE.ID
) PV
SET
FINAL_NAME = PV.FINAL_NAME
WHERE SUBJECT_TEACHER_TABLE.SUB_ID = PV.SUB_ID;

Consulta modificada: Según la sugerencia de @dnoeth

UPDATE SUBJECT_TEACHER_TABLE
FROM (
WITH NAME_CTE AS (
SELECT FIRST.ID,FIRST.NAM,LAST.NAME
FROM TABLE_FIRST FIRST INNER JOIN TABLE_LAST LAST
ON FIRST.ID = LAST.ID)
SELECT CROSS_TBL.SUB_ID,
COALESCE(CTE1.NAM,CTE1.NAME,CTE2.NAM,CTE2.NAME) AS FINAL_NAME
FROM CROSS_REFERENCE_TABLE CROSS_TBL
LEFT JOIN NAME_CTE CTE1 ON CROSS_TBL.CR_ID1 = CTE.ID
LEFT JOIN NAME_CTE CTE2 ON CROSS_TBL.CR_ID2 = CTE.ID
) PV
SET
FINAL_NAME = PV.FINAL_NAME
WHERE SUBJECT_TEACHER_TABLE.SUB_ID = PV.SUB_ID;

Error:

SQL Error [3807] [42S02]: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 3807] [SQLState 42S02] Object ‘NAME_CTE’ does not exist.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Respuesta:
    Desafortunadamente, no es posible actualizar una tabla utilizando otra tabla que se está uniendo con CTE en Teradata 16.20. Los CTE no están soportados en la instrucción UPDATE en Teradata 16.20. En su lugar, puedes utilizar una tabla volátil.

Comments are closed.