Tabla1

id  class_id  class
1   
2   
3   

Tabla2

sameid  class_id
2       20
3       30
1       40

Tabla3

class_id    desc
30          forest
40          urban
20          water

Quiero insertar Table3.class_id y Table3.desc en Table1.class_id y Table1.class uniendo Table1-Table2-Table3.

Así que intento:

INSERT INTO Table1 (class_id,class)
SELECT Table3.class_id, Table3.desc
FROM Table2
INNER JOIN Table3 ON Table2.class_id=Table3.class_id
WHERE Table1.id = Table2.sameid

Pero obtengo un error: entrada de cláusula FROM de referencia no válida para la tabla "Table1". ¿Qué estoy haciendo mal?

0
BERA 17 oct. 2018 a las 09:30

2 respuestas

La mejor respuesta

Podemos hacer una unión de actualización con la ayuda del siguiente CTE:

WITH cte AS (
    SELECT t2.sameid, t2.class_id, t3.desc
    FROM table2 t2
    INNER JOIN table3 t3
        ON t2.class_id = t3.class_id
)

UPDATE table1 AS t1
SET
    class_id = t2.class_id,
    class    = t2.desc
FROM cte AS t2
WHERE t1.id = t2.sameid;

La estrategia aquí es crear un CTE que contenga todas las columnas que queremos usar en la actualización, direccionables por sameid, que se mapea al id en table1. Luego, solo usamos una combinación de actualización de Postgres para traer los valores.

2
Tim Biegeleisen 17 oct. 2018 a las 06:46

Soy consciente de que ya existe una respuesta aceptada, pero puede aprovechar las vistas si desea mantener su concepto de "Tabla1" actualizado sin tener que insertar periódicamente más datos.

CREATE VIEW Table1_vw AS
SELECT Table3.class_id, Table3.desc
FROM Table2
INNER JOIN Table3 ON Table2.class_id=Table3.class_id
WHERE Table1.id = Table2.sameid

Luego puede consultar Table1_vw como si fuera una tabla real

SELECT * FROM Table1_vw;

Editar: lea los comentarios para ver cómo funcionan las inserciones y las actualizaciones en el contexto de las vistas.

0
Alexander De Sousa 17 oct. 2018 a las 07:32