Postgresql ОБНОВЛЕНИЕ ВЛЕВО СОЕДИНИТЬ - PullRequest
0 голосов
/ 24 августа 2018

Итак, у меня есть следующий код, который обновляет таблицу языковых строк на основе идентификатора и кода языка.Если я выполняю SELECT, используя то же самое из выражения, он выбирает только одну строку.Если я обновлю, он обновит все строки.Где я ошибаюсь?

UPDATE shopmaster.catalog_lang SET shortname='TEST' 
FROM shopmaster.catalog_lang cl LEFT JOIN shopmaster.lang l ON cl.langid=l.langid 
WHERE cl.catalogid=7 AND l.code='fr';

Вот определение двух таблиц:

CREATE TABLE IF NOT EXISTS shopmaster.lang(
    langid SERIAL,
    name TEXT,
    code TEXT,
    active BOOLEAN,
    donotdelete BOOLEAN,
    PRIMARY KEY (langid)


CREATE TABLE IF NOT EXISTS shopmaster.catalog_lang(
    catalogid INT references shopmaster.catalog(catalogid),
    langid INT references shopmaster.lang(langid),
    title TEXT,
    shortname TEXT,
    dirname TEXT,
    PRIMARY KEY (catalogid, langid)
);

1 Ответ

0 голосов
/ 24 августа 2018

Не повторять таблицу, обновляемую в FROM. Итак:

UPDATE shopmaster.catalog_lang cl
    SET shortname = 'TEST' 
FROM shopmaster.lang l 
WHERE cl.langid = l.langid AND cl.catalogid = 7 AND l.code = 'fr';

В Postgres каждая ссылка на таблицу является отдельной. Ваше обновление эквивалентно этому SELECT:

SELECT . . .
FROM shopmaster.catalog_lang CROSS JOIN
     shopmaster.catalog_lang cl LEFT JOIN
     shopmaster.lang l
     ON cl.langid = l.langid 
WHERE cl.catalogid = 7 AND l.code = 'fr';

И это определенно не то, что вы намереваетесь.

...