从多行中选择数据并将其插入到列中

1 subquery

我的表是这样的:

temp1
name   city     phone_no    pincode
-----------------------------------
amit   Delhi     12345       123
Rajiv  Bombay   836536       432
Run Code Online (Sandbox Code Playgroud)

如何将最后三列转换为单列address,如下所示?

name     address
----------------
amit      Delhi
amit      12345
amit        123
rajiv    Bombay
rajiv    836536
rajiv       432
Run Code Online (Sandbox Code Playgroud)

Len*_*art 6

答案的优雅会因您选择的 DBMS 而异。最简单的形式:

select name, city as address from temp1
union
select name, phone_no as address from temp1
union
select name, pincode as address from temp1
Run Code Online (Sandbox Code Playgroud)

我相信这应该得到大多数 DBMS 的支持。如果您的 DBMS 支持横向(在 sqlserver 中交叉应用?),您可以执行以下操作:

select x.name, y.address
from temp x 
join lateral ( values (x.name,x.city)
                    , (x.name,x.phone_no)
                    , (x.name,x.pincode)) y(name,address) 
    on x.name = y.name
Run Code Online (Sandbox Code Playgroud)

编辑:T-SQL (SQL Server) 语法使用 CROSS APPLY 来执行相同的任务,即:

SELECT x.name, y.address
FROM temp x 
CROSS APPLY ( VALUES (x.city),
                     (x.phone_no),
                     (x.pincode)
            ) AS y(address) 
Run Code Online (Sandbox Code Playgroud)

CROSS APPLY 在 SQL Server 中也经常生成比一堆联合运算符更有效的执行计划,因此绝对值得一试。

编辑:正如@ypercube 建议没有必要加入,删除名称列并采用笛卡尔积给出相同的结果

select x.name, y.address 
from temp x 
cross join lateral ( 
    values (x.city),(x.phone_no),(x.pincode)
) y(address)
Run Code Online (Sandbox Code Playgroud)