Оператор UPDATE с несколькими соединениями с основной таблицей в PostgreSQL - PullRequest
0 голосов
/ 19 сентября 2018

Я переписываюсь с mysql на postgres.

Я пытаюсь обновить таблицу EUTMPDFHDT T с таблицей соединений EUTMPDFH T1 и EUTMPTBLDT T2.

Вот код, который я использую в mysql.

UPDATE EUTMPDFHDT
SET NWCOLID=T2.NWCOLID
FROM EUTMPDFHDT T
INNER JOIN EUTMPDFH T1 ON T.DFHID = T1.DFHID AND T1.DFHTYP IN ('D','U','S','P','B')
INNER JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID

В postgres я пытался следовать этому выражению UPDATE с несколькими объединениями в PostgreSQL

Но безрезультатно, я не могу решить его, поскольку оператор обновления не являетсято же самое.

Вот что я сделал в postgres:

UPDATE EUTMPDFHDT AS T
SET NWCOLID=T2.NWCOLID
FROM 
EUTMPDFH T1
JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
WHERE T.DFHID = T1.DFHID AND T1.DFHTYP IN ('D','U','S','P','B');

Вот ошибка, с которой я столкнулся

ERROR:  invalid reference to FROM-clause entry for table "t"
LINE 5:  JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
                               ^
HINT:  There is an entry for table "t", but it cannot be referenced from this part of the query.
QUERY:  UPDATE EUTMPDFHDT AS T
    SET NWCOLID=T2.NWCOLID
    FROM 
    EUTMPDFH T1
    JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
    WHERE T.DFHID = T1.DFHID AND T1.DFHTYP IN ('D','U','S','P','B')

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Нельзя ссылаться на столбец таблицы FROm из условия ON в запросе на обновление.Вы можете изменить запрос следующим образом

UPDATE EUTMPDFHDT AS T
SET NWCOLID=Q.NWCOLID
FROM (SELECT T2.NWCOLID, T.DFHID 
FROM EUTMPDFHDT AS T
JOIN EUTMPDFH T1 ON  T.DFHID = T1.DFHID 
JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
WHERE T1.DFHTYP IN ('D','U','S','P','B'))Q
WHERE Q.DFHID=T.DFHID
0 голосов
/ 19 сентября 2018

Как указано в руководстве , вы должны , а не повторить таблицу назначения в предложении FROM инструкции UPDATE.

Предложение FROM для ОБНОВЛЕНИЯ, к сожалению, не следует тем же правилам, которые используются в предложении SELECT.Проще использовать старые неявные объединения вместо (обычно предпочтительных) явных операторов JOIN.

Насколько я могу судить, это то, что вы ищете:

UPDATE eutmpdfhdt as t
  SET nwcolid = t2.nwcolid
FROM eutmpdfh t1, 
     eutmptbldt t2 
WHERE t.dfhid = t1.dfhid 
  AND t.colid = t2.colid  
  AND t1.dfhtyp IN ('D','U','S','P','B')
0 голосов
/ 19 сентября 2018

Вы не можете включить столбец из таблицы, которую хотите обновить, в предложение ON.Это должно быть ГДЕ.Если вы измените свой код следующим образом, я думаю, он даст вам нужный вам результат:

UPDATE
    EUTMPDFHDT AS T
SET
    NWCOLID = T2.NWCOLID
FROM
    EUTMPTBLDT T2
WHERE
    T.COLID = T2.COLID AND
    EXISTS (SELECT 1 FROM EUTMPDFH WHERE DFHID = t.DFHID AND DFHTYP IN ('D','U','S','P','B'));
...