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)
答案的优雅会因您选择的 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)