PostgreSQL 13:如何仅在CTE非空时执行关联UPDATE操作
PostgreSQL 13中仅当CTE有数据时执行UPDATE操作
可以通过在UPDATE语句的WHERE子句中添加CTE存在性检查,实现仅当CTE返回数据时才执行更新,避免空CTE导致的查询卡住问题。以下是两种可行的实现方式:
方法一:简洁的存在性检查
直接在UPDATE的WHERE条件中加入对CTE的存在性验证,当CTE为空时,整个WHERE条件不成立,UPDATE不会执行任何操作:
WITH cte AS ( SELECT * FROM some_other_table ) UPDATE table_to_update SET column_from_table_to_update = cte.some_column FROM cte WHERE table_to_update.date = cte.date AND EXISTS (SELECT 1 FROM cte);
方法二:额外CTE预检查存在性
如果CTE的查询代价较高,可以通过额外的CTE先确认是否有数据,避免重复扫描原表:
WITH cte AS ( SELECT * FROM some_other_table ), cte_has_data AS ( SELECT 1 FROM cte LIMIT 1 ) UPDATE table_to_update SET column_from_table_to_update = cte.some_column FROM cte WHERE table_to_update.date = cte.date AND EXISTS (SELECT 1 FROM cte_has_data);
原理说明
当CTE为空时,EXISTS (SELECT 1 FROM cte) 或 EXISTS (SELECT 1 FROM cte_has_data) 会返回false,UPDATE语句的WHERE条件整体不成立,PostgreSQL不会对table_to_update执行任何扫描或更新操作,从根源上避免了空CTE导致的查询卡住问题。
内容的提问来源于stack exchange,提问作者Mihir
相关产品推荐
相关产品推荐

