首页 > 解决方案 > 如何从多个表中将一行拆分为多个列

问题描述

我有 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

我的专栏是动态的。

我怎样才能做到这一点?谢谢。

标签: sqloracleplsql

解决方案


假设表 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,但我不推荐它,因为它会很复杂并且可能比在中间层执行转换要慢得多。


推荐阅读