Oracle中无关联键表连接:将单值表值填充至多行表列
解决Oracle无连接键表关联并新增固定值列的问题
嘿,这个场景我之前帮同事处理过!因为两张表没有可用的连接键,我们得用**笛卡尔积(Cross Join)**来实现表的关联,同时加上你需要的固定列填充。先给你分两种常见情况说明:
情况1:新增列用AllCustomers表中的某个固定统一值
如果你的需求是给所有生成的结果行都填充同一个来自AllCustomers的值(比如这个表里某字段的唯一值,或者你指定的某个特定值),可以用子查询先取出这个固定值,再做笛卡尔积:
SELECT t1.*, -- 第一张表的所有字段 t2.*, -- 第二张表的所有字段 ac.target_column AS new_custom_column -- 新增的第三列,用固定值填充 FROM 你的第一张表名 t1 CROSS JOIN 你的第二张表名 t2 -- 子查询取出AllCustomers里的目标固定值,如果值唯一可以去掉DISTINCT CROSS JOIN (SELECT DISTINCT target_column FROM AllCustomers) ac;
说明:
CROSS JOIN会把两张表的所有行进行全组合(也就是笛卡尔积),这是没有连接键时的唯一关联方式。- 子查询
(SELECT DISTINCT target_column FROM AllCustomers)用来确保我们只取到唯一的那个值,避免结果集因为AllCustomers的多行而重复膨胀。如果AllCustomers里的target_column本身就只有一个值,DISTINCT可以省略。
情况2:新增列随AllCustomers的行动态取值(如果需要的话)
如果你其实是想让AllCustomers的每一行都和前两张表的所有组合行关联,新增列对应AllCustomers各行的值,可以直接连三张表的笛卡尔积:
SELECT t1.*, t2.*, ac.target_column AS new_custom_column FROM 你的第一张表名 t1 CROSS JOIN 你的第二张表名 t2 CROSS JOIN AllCustomers ac;
注意事项:
笛卡尔积的结果行数是两张表行数的乘积(如果连AllCustomers就是三者乘积),如果你的表数据量很大,结果集会非常庞大,可能导致性能问题,一定要确认业务需求是否真的需要全量组合。
内容的提问来源于stack exchange,提问作者Gabriela M
相关产品推荐
相关产品推荐

