You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:32:34