我想根据另一个字段中的条件更新数据库中的列.我可以通过两个不同的查询来实现:

update table_a
    set field_1 = 'English text'
        where ctid in (
            select table_a.ctid from table_a
                left join table_b
                    on table_b.a_id  = table_b.id
                left join table_c
                    on table_c.id = table_b.c_id
            where table_c.language = 'EN'
        );

update table_a
    set field_1 = 'French text'
        where ctid in (
            select table_a.ctid from table_a
                left join table_b
                    on table_b.a_id  = table_b.id
                left join table_c
                    on table_c.id = table_b.c_id
            where table_c.language = 'FR'
        );

然而,还有更多的语言需要考虑.我想编写一个脚本,我可以为它定义语言/文本对的映射,然后 for each 对执行上面的语句.我怎么才能接近这一点呢?

我try 为循环查找PL/pgSQL,但我无法应用我能找到的示例.

推荐答案

一种 Select 是将语言代码/描述对声明为行,然后进行筛选和更新.

我还怀疑您的in条件可以重写为exists,而无需使用ctid并重新打开源表.所以:

update table_a as a
set field_1 = v.txt
from ( values 
    ('EN', 'English text'), 
    ('FR', 'French text') 
) as v(code, txt)
where exists ( 
    select 1 
    from table_b as b 
    inner join table_c as c on c.id = b.c_id 
    where c.language = v.code and b.a_id = a.id
)

Sql相关问答推荐

如何在T—SQL中找到值更改之前的日期?

如何连接第二个表并将其内容输入到第一个表的单个字段中?

替换上一个或下一个值中的空值并添加其价格日期

在PostgreSQL中汇总连接表中的 case 值

PostgreSQL-按距离阈值挤压相邻行的性能

在SQL中,筛选其他列中只有一个值的ID

SQL仅返回第一个字母在A-Z之间的值

获取分布在同一行的列中的出现次数

SAS proc freq 或 proc sql 获取数据子集和整个数据的频率

创建具有多个子查询的 SQL 视图

SQL 根据前一天的最大值计算每天的值数

如何在 case 语句中使用聚合?

带有数组输入参数的Snowflake UDF优化

SQL - 只需要 GROUP BY SELECT 的一列

字符串从更改到表列和查询中的一行的转换错误

如何防止 SQL 中的负收入值并将其重新分配到接下来的月份?

在 sql 中合并系列以删除重复项

Oracle SQL 查询自行运行,但在包装到select count(*) from ()时失败

如何列出 Oracle 数据库中的所有函数并按修改日期排序

如何在 SQLite 中将列的两个或多个相等的连续值合并为一个?