Объединить таблицы вставить в третий - PullRequest
0 голосов
/ 17 октября 2018

Table1

id  class_id  class
1   
2   
3   

Table2

sameid  class_id
2       20
3       30
1       40

Table3

class_id    desc
30          forest
40          urban
20          water

Я хочу вставить Table3.class_id и Table3.desc в Table1.class_id и Table1.class, присоединив Table1-Table2-Table3.

Поэтому я пытаюсь:

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

Но я получаю сообщение об ошибке: недопустимая ссылка в записи предложения FROM для таблицы "Table1".Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я знаю, что принятый ответ уже существует, но вы можете использовать просмотров , если хотите поддерживать свою концепцию "Table1" в актуальном состоянии без необходимости периодически вставлять дополнительные данные

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

Затем вы можете запросить Table1_vw, как если бы это была настоящая таблица

SELECT * FROM Table1_vw;

Редактировать: Прочитать комментарии, чтобы увидеть, как работают вставки и обновления в контексте представлений.

0 голосов
/ 17 октября 2018

Мы можем сделать объединение обновлений с помощью следующего 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;

Стратегия здесь заключается в создании CTE, который содержит все столбцы, которые мы хотим использовать в обновлении, адресуемые с помощью sameid, который соответствует id в table1.Затем мы просто используем объединение обновлений Postgres для ввода значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...