sql - 如何从多个表中将一行拆分为多个列
问题描述
我有 2 张桌子,他们有关系:
select * from tableA,tableB
inner join tableA.id=tableB.id
这个查询给了我:
tableACol1 tableACol2 tableACol3 tableBCol1 tableBCol2 tableBCol3
a;b;c 1;2;3 t x;y 8;9 p
我也想这样做:
col1 col2 col3 col3 col4 col5 col6 col6 col7 col8 col9 col10
a 1 b 2 c 3 t x 8 y 9 p
我的专栏是动态的。
我怎样才能做到这一点?谢谢。
解决方案
假设表 A 最多有 3 个项目,表 B 最多有 2 个项目,那么您可以使用:
SELECT REGEXP_SUBSTR(a1, '[^;]+', 1, 1) AS col1,
REGEXP_SUBSTR(a2, '[^;]+', 1, 1) AS col2,
REGEXP_SUBSTR(a1, '[^;]+', 1, 2) AS col3,
REGEXP_SUBSTR(a2, '[^;]+', 1, 2) AS col3,
REGEXP_SUBSTR(a1, '[^;]+', 1, 3) AS col4,
REGEXP_SUBSTR(a2, '[^;]+', 1, 3) AS col5,
A3 AS col6,
REGEXP_SUBSTR(b1, '[^;]+', 1, 1) AS col6,
REGEXP_SUBSTR(b2, '[^;]+', 1, 1) AS col7,
REGEXP_SUBSTR(b1, '[^;]+', 1, 2) AS col8,
REGEXP_SUBSTR(b2, '[^;]+', 1, 2) AS col9,
B3 AS col10
FROM your_query;
您的列命名已在输出中复制,但更好的做法是唯一命名列。
其中,对于样本,数据:
CREATE TABLE your_query (A1, A2, A3, B1, B2, B3) AS
SELECT 'a;b;c', '1;2;3', 't', 'x;y', '8;9', 'p' FROM DUAL
输出:
COL1 COL2 COL3 COL3 COL4 COL5 COL6 COL6 COL7 COL8 COL9 COL10 一个 1 b 2 C 3 吨 X 8 是的 9 p
db<>在这里摆弄
如果您有可变数量的列,那么您最好使用用于访问数据库的任何中间层语言(即 C#、PHP、Java、C++)执行转换,因为 SQL(不仅仅是 Oracle SQL)必须具有固定数量的已知列。
可以在 PL/SQL 中使用动态 SQL 以编程方式生成 SQL 语句然后使用EXECUTE IMMEDIATE
,但我不推荐它,因为它会很复杂并且可能比在中间层执行转换要慢得多。
推荐阅读
- json - 我似乎无法在我的轮播小部件中显示我的 JSON 数据图像。(扑)
- linux - Postgresqll 10:Postgres 用户 /sbin/nologin 阻止 initdb 设置
- python - PyInstaller 由于 win32 兼容模块引发 ValueError
- python - 在 Postgresql 中使用(大对象)在磁盘上写入二进制文件
- c++ - 在另一个线程中调用类成员函数时的警告消息
- c# - 在 .NET Core Web API 中继承路由属性
- google-apps-script - Google 表单在 1 次提交后提交类似的先前表单提交
- c# - 在可重用的用户控件中绑定转换器参数
- c# - 无法运行 Excel 加载项函数
- deno - 如何在 Oak/deno 中访问表单主体