sql - postgresql 插入更新
问题描述
INSERT INTO analytic_filter_log_device(guest_device_id,query_filter_id,created_time) VALUES (UPDATE guest_device gd
SET status = false
FROM(
SELECT
gl.guest_device_id AS device_id
FROM guest_login gl
JOIN guest_device gd ON gd.id = gl.guest_device_id AND gd.status = TRUE
JOIN guest_login_ap gla ON gla.guest_login_id = gl.id
JOIN config_ap ca ON ca.id = gla.ap_id AND ca.company_id = 1
WHERE ('2018-06-26 00:00:00' IS NULL OR '2018-07-26 23:59:59' IS NULL OR (gla.start_time, gla.end_time) OVERLAPS ('2018-06-26 00:00:00', '2018-07-26 23:59:59')) AND
get_duration_in_interval(gla.start_time, gla.duration::bigint, '2018-06-26 00:00:00', '2018-07-26 23:59:59') >= 5
GROUP BY gl.guest_device_id
HAVING COUNT(DISTINCT gl.id) >= 5
) as t1
WHERE gd.id = t1.device_id
RETURNING 1,1,now());
解决方案
您可以使用这样的select
内部values
子句。您可以使用指定常量,insert into .. values (1,2,3)
也可以直接使用选择查询作为插入源:insert into ... select ... from
您可以通过两种方式重写查询:
您需要使用数据修改 CTE
with updated (guest_device_id) as (
UPDATE guest_device gd
SET status = false
FROM(
SELECT gl.guest_device_id AS device_id
FROM guest_login gl
JOIN guest_device gd ON gd.id = gl.guest_device_id AND gd.status = TRUE
JOIN guest_login_ap gla ON gla.guest_login_id = gl.id
JOIN config_ap ca ON ca.id = gla.ap_id AND ca.company_id = 1
WHERE (gla.start_time, gla.end_time) OVERLAPS ('2018-06-26 00:00:00', '2018-07-26 23:59:59'))
AND get_duration_in_interval(gla.start_time, gla.duration::bigint, '2018-06-26 00:00:00', '2018-07-26 23:59:59') >= 5
GROUP BY gl.guest_device_id
HAVING COUNT(DISTINCT gl.id) >= 5
) as t1
WHERE gd.id = t1.device_id
RETURNING gd.id
)
INSERT INTO analytic_filter_log_device(guest_device_id,query_filter_id,created_time)
select guest_device_id, 1, now()
from updated;
或者update returning
直接在select
查询中使用:
INSERT INTO analytic_filter_log_device(guest_device_id,query_filter_id,created_time)
select id, 1, now()
from (
UPDATE guest_device gd
SET status = false
FROM(
SELECT gl.guest_device_id AS device_id
FROM guest_login gl
JOIN guest_device gd ON gd.id = gl.guest_device_id AND gd.status = TRUE
JOIN guest_login_ap gla ON gla.guest_login_id = gl.id
JOIN config_ap ca ON ca.id = gla.ap_id AND ca.company_id = 1
WHERE (gla.start_time, gla.end_time) OVERLAPS ('2018-06-26 00:00:00', '2018-07-26 23:59:59'))
AND get_duration_in_interval(gla.start_time, gla.duration::bigint, '2018-06-26 00:00:00', '2018-07-26 23:59:59') >= 5
GROUP BY gl.guest_device_id
HAVING COUNT(DISTINCT gl.id) >= 5
) as t1
WHERE gd.id = t1.device_id
RETURNING gd.id
) t;
请注意,我将硬编码替换为returning 1
并returning gd.id
删除了无用的'2018-06-26 00:00:00' IS NULL
部分(因为这总是正确的)
推荐阅读
- stackexchange-api - 如何通过 1 个调用从不同对象获取信息?
- javascript - 如何根据我的变量的范围选择通过 Ajax 更新价格?
- apache-spark - 是否可以使用 YARN 容量调度程序在 Spark 上运行 Hive?
- java - JTable 列的标题不会显示
- c# - Linq with EF core 2.2 Condition with where Clause FK and PK
- websocket - 在检查 android 应用程序的 api websocket 期间,charles 出现未知错误
- spring-boot - spring boot logback 刷新
- python - 如何更改导入超时限制(python2.7 和 oct2py)
- material-ui - 如何在 AppBar 中将 NavLink 移动到右侧?
- botframework - 提示设计英雄卡