带有循环的 Postgres SQL 脚本
Posted
技术标签:
【中文标题】带有循环的 Postgres SQL 脚本【英文标题】:Postgres SQL script with loop 【发布时间】:2016-01-30 09:42:28 【问题描述】:我需要编写一个 Postgres 脚本来遍历我在特定表中的所有行,获取该行中的日期列,找到另一个表中具有该日期的所有行,并将该行的 ID 分配给该行其外键列的第一行。进一步解释,我的数据(简化)如下所示:
first_table:
id INT, run_date DATE
第二张桌子:
id INT, target_date TIMESTAMP, first_table_id INT
伪代码:
first_table_array = SELECT * FROM first_table;
i, val = range first_table_array
UPDATE second_table SET first_table_id=val.id WHERE date=val.run_date
但实际上并不是那么简单,因为我将日期与时间戳进行比较(我认为这会导致一些问题?),并且我还需要优化时间段。
因此,我实际上需要检查日期是否从凌晨 4 点开始到第二天凌晨 4 点,而不是执行 where date=val.run_date。
所以说 run_date 是 01/01/2015,我需要将该值转换为 01/01/2015 04:00:00 的时间戳,然后创建另一个时间戳 01/02/2015 04:00:00 ,然后做:
where date > first_date AND date < second_date.
所以,是这样的:
伪代码:
first_table_array = SELECT * FROM first_table;
i, val = range first_table_array
first_date = timestamp(val.run_date) + 4 hrs
second_date = timestamp(val.run_date + 1 day) + 4 hrs
UPDATE second_table SET first_table_id=val.id WHERE date > first_date AND date < second_date
postgres 有能力做这种事情,还是我最好写一个脚本来做这件事?我是否需要使用循环,或者我可以仅使用连接和标准 SQL 查询来完成这些工作吗?
【问题讨论】:
你能发布一些带有期望输出的真实数据样本吗?你也可以尝试创建一个sqlfiddle.com 【参考方案1】:我已经尽力了。数据样本会很棒。
UPDATE second_table ST
SET ST.id = FT.id
FROM first_table FT
WHERE ST.date BETWEEN FT.run_date + interval '4 hour'
AND FT.run_date + interval '4 hour' + interval '1 day'
How to do an update + join in PostgreSQL?
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
注意:
BETWEEN
等价于使用<=
和>=
【讨论】:
非常感谢,太完美了!很高兴看到我不需要任何复杂的东西,比如循环或脚本。以上是关于带有循环的 Postgres SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Postgres 在 SQL 中执行 for 循环?
从java调用带有UDT参数的postgres函数给SQL尚未实现异常