如何在两张表间做条件选择,为Tableau仪表盘更新视图?
高效选择两张表中最新数据的替代方案
核心优化思路
先单独获取两张表的最大刷新日期,再根据日期优先级直接选择对应表的全部数据,彻底避免全表UNION带来的性能损耗。
两种可行SQL实现
方法1:通过CTE先计算日期再筛选
WITH date_comparison AS ( SELECT (SELECT MAX(date) FROM table1) AS t1_latest, (SELECT MAX(date) FROM table2) AS t2_latest ) SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM date_comparison WHERE t1_latest >= t2_latest) UNION ALL SELECT * FROM table2 WHERE EXISTS (SELECT 1 FROM date_comparison WHERE t2_latest > t1_latest);
方法2:直接用子查询做条件判断
-- 当table1日期最新或两者相同时,取table1 SELECT * FROM table1 WHERE (SELECT MAX(date) FROM table1) >= (SELECT MAX(date) FROM table2) -- 仅当table2日期更新时,取table2 UNION ALL SELECT * FROM table2 WHERE (SELECT MAX(date) FROM table2) > (SELECT MAX(date) FROM table1);
性能提升点
- 仅需查询两张表的最大日期(如果日期列有索引,这一步几乎是瞬间完成),不需要扫描全表数据
- 最终只读取选中的那张表,完全避免了原方案中合并两张大表产生的大量临时数据
原方案的问题
你之前的UNION方案需要先合并两张全量数据,再做过滤,对于数据仓库里的大表来说,会产生巨量中间数据,严重拖慢查询速度,上述方案从根源上减少了数据处理量。
内容的提问来源于stack exchange,提问作者anandu Menon
相关产品推荐
相关产品推荐

