Oracle中如何实现不同CODE与DATE_COL的全量组合查询,生成笛卡尔积结果集
解决方案:使用交叉连接(Cross Join)生成全量组合
这其实是个典型的笛卡尔积需求,Oracle的CROSS JOIN语法刚好能完美解决这个问题,我给你拆解下实现思路和具体语句:
核心思路
要让去重后的CODE和去重后的DATE_COL实现全量配对,本质就是把这两个独立的去重结果集做交叉连接——也就是让每个CODE和每个DATE_COL都两两组合一次,最终结果的行数自然就是两个去重集合的行数乘积。
具体SQL语句
你可以用DISTINCT(或者你原本习惯的GROUP BY,两者效果一致)获取去重值,再通过CROSS JOIN组合:
SELECT c.code, d.date_col, 1 AS val -- 按照你的期望结果,VAL固定为1,直接取值即可 FROM -- 生成去重的CODE集合 (SELECT DISTINCT code FROM TEMP_TEST) c CROSS JOIN -- 生成去重的DATE_COL集合 (SELECT DISTINCT date_col FROM TEMP_TEST) d ORDER BY c.code, d.date_col;
如果后续VAL可能有不同取值,需要从原表匹配对应值(无匹配时用默认值填充),可以改成左关联原表的写法:
SELECT c.code, d.date_col, COALESCE(t.val, 1) AS val -- 原表存在对应组合则取原VAL,否则用1填充 FROM (SELECT DISTINCT code FROM TEMP_TEST) c CROSS JOIN (SELECT DISTINCT date_col FROM TEMP_TEST) d LEFT JOIN TEMP_TEST t ON c.code = t.code AND d.date_col = t.date_col ORDER BY c.code, d.date_col;
效果说明
CROSS JOIN会自动把第一个结果集的每一行和第二个结果集的每一行配对,完全满足你要的全量组合需求;DISTINCT确保CODE和DATE_COL都是唯一值,避免产生重复的组合;ORDER BY让结果和你期望的格式一致,按CODE、DATE_COL升序排列。
执行后就能得到你要的6行结果,和给出的期望输出完全匹配。
内容的提问来源于stack exchange,提问作者Gábor DANI
相关产品推荐
相关产品推荐

