根据两个表中的条件更新外键

时间:2014-11-12 23:52:27

标签: sql postgresql sql-update

我们说我有一个自定义字段表,并且可以将自定义字段分组。让我们说我有一个小组表。

我们还说我有一个约定,即自定义字段名称的前缀应该是groupName_,其中groupName是groups表的标题列。

如何更新大量现有自定义字段以在SQL中获取组ID?我试过这个:

UPDATE fields, fgroup
SET group_id = fgroup.id
WHERE name LIKE 'gp1\_%' AND SUBSTRING(name, 0, 4)) = lower(title) AND fields.account_id=fgroup.account_id AND fields.account_id = 111;

此操作失败,因为更新不会占用多个表。

如何为组名列表(gp1,gp2,gp3,gp4)执行此操作?我怎么能修改前缀长度? (并不总是SUBSTRING(name, 0, 4),而是根据前缀的长度填充第三个参数,直到第一个下划线?

1 个答案:

答案 0 :(得分:1)

您的查询看起来像SQL-Server或MySQL语法。在Postgres中,您只能在单个语句中更新单个表。使用FROM子句加入其他表。 Details in the manual.

对于单个组(每个列所属的猜测工作)

UPDATE fields f
SET    group = g.id
FROM   fgroup g
WHERE  f.name LIKE 'gp1\_%'
AND    left(f.name, 4) = lower(g.title)
AND    f.account_id = 111
AND    f.account_id = g.account_id;

对于多个群组和a,引用:populated third parameter based on the length of the prefix,我们将其命名为prefix_len

UPDATE fields f
SET    group = g.id
FROM   fgroup g
WHERE  left(f.name, prefix_len) = ANY '{gp1,gp2,gp3,gp4}'::text[]
AND    left(f.name, prefix_len) = lower(g.title)
AND    f.account_id = 111
AND    f.account_id = g.account_id;

除此之外:group is a reserved word,请勿将其用作标识符。