【问题标题】:How to Split a row into multiple columns from multi tables如何从多表中将一行拆分为多列
【发布时间】:2021-12-19 06:35:31
【问题描述】:

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

我的专栏是动态的。

我该怎么做? 谢谢。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    假设 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
    a 1 b 2 c 3 t x 8 y 9 p

    db小提琴here


    如果您有可变数量的列,那么您最好使用任何中间层语言(即 C#、PHP、Java、C++)执行转换,以作为 SQL(不仅仅是 Oracle SQL)访问数据库必须有固定数量的已知列。

    可以在 PL/SQL 中使用动态 SQL 以编程方式生成 SQL 语句,然后使用 EXECUTE IMMEDIATE,但我不建议这样做,因为它会很复杂并且可能比在中间层。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多