1

我正在从一个搞砸的数据库中修改一些表。一些表具有相同的数据但表名不同,并且每个表也有相似的数据但列名不同。无论如何,这是一个奇怪的要求,但必须像这样。

我需要将行向上旋转以模拟一行,这样我就可以从两个不同的表中创建一条记录。

我附上了一张照片。左侧的表格将拉出一行,左侧的表格将根据左侧表格的 id 提供 1 - n 行。我需要将行向上旋转以模拟一行并使用两个结果创建一条记录。

从我的在线检查来看,支点似乎是要走的路,但它似乎希望我进行分组或进行某种类型的聚合。

这样做的最佳方法是什么?

table1 ---Produces one row
table1id | col1 | col2 | col3
1    Wow    Wee    Zee

table2 ---Produces 1 - n rows
table2id | table1id | col1 | col2 | col3
1            1        sock   cloth  sup
2            1        bal    baa    zak
3            1         x      y    fooZ

需要看起来像这样(下面不是列名,它们是结果集)

Woo,wee,zee,sock,cloth,sup,bla,baaa,zak,x,y,fooZ

在此处输入图像描述

4

1 回答 1

1

如果使用 MySQL:

SELECT a.table1id, GROUP_CONCAT(a.col) AS col_values
FROM
(
    SELECT table1id, col1 col FROM table1 UNION ALL
    SELECT table1id, col2     FROM table1 UNION ALL
    SELECT table1id, col3     FROM table1 UNION ALL
    SELECT table1id, col1     FROM table2 UNION ALL
    SELECT table1id, col2     FROM table2 UNION ALL
    SELECT table1id, col3     FROM table2
) a
GROUP BY a.table1id

SQLFiddle 演示


如果使用 SQL-Server:

SELECT a.table1id, b.colnames
FROM table1 a
CROSS APPLY
(
    SELECT STUFF((
        SELECT ',' + aa.col
        FROM
        (
            SELECT table1id, col1 col FROM table1 UNION ALL
            SELECT table1id, col2     FROM table1 UNION ALL
            SELECT table1id, col3     FROM table1 UNION ALL
            SELECT table1id, col1     FROM table2 UNION ALL
            SELECT table1id, col2     FROM table2 UNION ALL
            SELECT table1id, col3     FROM table2
         ) aa
         WHERE aa.table1id = a.table1id
         FOR XML PATH('')
    ), 1, 1, '') AS colnames
) b

SQLFiddle 演示

于 2012-07-29T03:58:05.787 回答