如何不使用现有表实现cross join(交叉连接)操作?
完全可以实现,不需要创建任何实体表,你可以通过构造临时常量集合和原表做交叉连接来实现需求。
兼容全数据库的通用写法
假设你存储Col1的表名为source_table,可以用UNION ALL构造虚拟的数值序列:
SELECT t.Col1, num.Col2 FROM source_table t CROSS JOIN ( SELECT 1 AS Col2 UNION ALL SELECT 2 UNION ALL SELECT 3 ) num ORDER BY Col2, Col1;
主流新数据库简洁写法
支持VALUES行构造器的数据库(PostgreSQL、MySQL 8.0+、SQL Server等)可以用更简化的写法:
SELECT t.Col1, num.Col2 FROM source_table t CROSS JOIN (VALUES (1), (2), (3)) AS num(Col2) ORDER BY Col2, Col1;
Oracle适配写法
如果你使用Oracle数据库,需要调整为带DUAL的语法:
SELECT t.Col1, num.Col2 FROM source_table t CROSS JOIN ( SELECT 1 AS Col2 FROM DUAL UNION ALL SELECT 2 FROM DUAL UNION ALL SELECT 3 FROM DUAL ) num ORDER BY Col2, Col1;
上述所有写法中的子查询都是在内存中生成临时虚拟表,不会在数据库中产生任何实体存储对象,完全符合你不创建新表的要求,执行后输出的结果和你给出的示例完全一致。如果后续需要扩展更多Col2的取值,直接在UNION ALL或者VALUES列表中添加对应数值即可。
内容的提问来源于stack exchange,提问作者aukk123
相关产品推荐
相关产品推荐

