如何在SQL中合并不同表的日期列并作为统一索引
问题根因
- 现有SQL的关联条件仅匹配了
id字段,没有关联date字段,会导致同id不同日期的数据出现错误的笛卡尔积,输出结果不符合预期 - SELECT子句中分别查询了三个表的
date、id字段,因此会输出多组重复的日期、id列
解决方案
你可以用COALESCE函数合并三个表的date、id字段,同时完善关联条件,将date也加入关联逻辑,写法如下:
SELECT COALESCE(a.date, b.date, c.date) AS date, COALESCE(a.id, b.id, c.id) AS id, a.value AS a_value, b.value AS b_value, c.value AS c_value FROM table_a a FULL OUTER JOIN table_b b ON a.id = b.id AND a.date = b.date FULL OUTER JOIN table_c c ON COALESCE(a.id, b.id) = c.id AND COALESCE(a.date, b.date) = c.date
COALESCE函数会返回参数列表中第一个非空的值,刚好可以兼容全连接场景下,某张表没有对应id和date数据时,依然能拿到正确的日期和id值。如果你提到的a、b、c是CTE,直接替换语句中的table_a、table_b、table_c为你对应的CTE名称即可。
如果你使用的SQL方言支持USING语法,写法可以更简洁,USING会自动合并关联的同名字段,无需手动写COALESCE:
SELECT date, id, a.value AS a_value, b.value AS b_value, c.value AS c_value FROM table_a a FULL OUTER JOIN table_b b USING (id, date) FULL OUTER JOIN table_c c USING (id, date)
内容的提问来源于stack exchange,提问作者Rogue259
相关产品推荐
相关产品推荐

