Postgresql更新左连接

Postgresql更新左连接,sql,postgresql,sql-update,left-join,Sql,Postgresql,Sql Update,Left Join,因此,我有下面的代码根据id和语言代码更新语言字符串表。如果我使用相同的from表达式执行选择,它只选择一行。如果我更新,它会更新所有行。这件事我哪里做错了 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

因此,我有下面的代码根据id和语言代码更新语言字符串表。如果我使用相同的from表达式执行选择,它只选择一行。如果我更新,它会更新所有行。这件事我哪里做错了

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)
);

不要重复从中更新的表。因此:

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 . . .
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';
这绝对不是您想要的。

“请注意,除非您想要自联接,否则目标表不能出现在from_列表中。”。与您所做的选择等效的是
SELECT*from catalog\u lang cross join catalog\u lang left join lang on…
BTW:为什么要使用左连接?(与
WHERE…和l.code='fr'结合使用;