是否可以将 1 个选定的行列恰好转置为行

Is it possible to transpose exactly 1 selected row columns into rows

如标题所说,是否可以将表格中选定的一行恰好转置为列?我正在使用 Oracle 数据库。例如我有一个有点复杂的查询:

SELECT t1.id,
  t1.data1,
  t1.data2,
  t2.data1,
  t2.data2,
  t2.data3,
  subs1.data1,
  subs2.data1,
  subs2.data2
FROM Table1 t1
JOIN Table2 t2
ON t1.id = t2.id
JOIN
  (SELECT st1.id,
    st1.data1
  FROM subTable1 st1
  JOIN subTable2
  ON st1.id             = st2.id
  WHERE st2.data1       > 1
  ) AS subs1 ON subs.id = t2.id
LEFT JOIN
  (SELECT st3.id,
    st4.data1,
    st4.data2
  FROM subTable3 st3
  JOIN subTable4 st4
  ON st3.id = st4.id
  UNION
  SELECT st4.id, st4.data1, st4.data2 FROM subTable4 st4 WHERE st4.data1 = 1
  ) AS subs2.id = t1.id
WHERE t1.id     = 1

查询结果应如下所示,并且始终恰好是一行:

+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
| t1.id  |  t1.data1   |  t1.data2   |   t2data1   |  t2.data2   |  t2.data3   |  subs1.data1   |  subs2.data1   |  subs2.data2   |
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
| someId | someT1Data1 | someT1Data2 | someT2Data1 | someT2Data2 | someT2Data3 | someSubs1Data1 | someSubs2Data1 | someSubs2Data2 |
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+

我愿意达到的目标应该是这样的:

+-------------+----------------+
|    col1     |      col2      |
+-------------+----------------+
| t1.id       | someId         |
| t1.data1    | someT1Data1    |
| t1.data2    | someT1Data2    |
| t2data1     | someT2Data1    |
| t2.data2    | someT2Data2    |
| t2.data3    | someT2Data3    |
| subs1.data1 | someSubs1Data1 |
| subs2.data1 | someSubs2Data1 |
| subs2.data2 | someSubs2Data2 |
+-------------+----------------+

注意:输出中不需要 col1

所以问题是: 是否有一些简单的解决方法可以将表格中的一个选定行恰好转置为列?我的意思是比使用 PIVOT() 函数更简单的方法,或者如果没有其他选择,如何在有点复杂的查询(嵌套查询等)上使用 PIVOT()?

提前谢谢你。

Pivot 是完成这项工作的工具,但您也可以通过将查询放在 CTE 中然后使用多个 union all 分别获取列来获得相同的结果:

with cte as (
    /* your query, with appropriate aliases for columns with same name*/
)
select 't1.id' as col1, cte.id as col2 from cte union all
select 't1.data1', cte.data1 from cte union all
...
select 'subs2.data2', cte.subsdata2 from cte
在这种情况下,

Pivot 将是更好的选择。获得第一部分结果后,只需使用此查询即可。

SELECT col1, col2 from @Table
 Unpivot
(Col2 For Col1 IN 
(t1.id,t1.data1,t1.data2,t2.data1,t2.data2,t2.data3,subs1.data1,subs2.data1,subs2.data2)) AS a

如果您遇到任何困难,请告诉我。