SQL如何实现两列数据追加为单列并按ID匹配输出多行结果
列转行实现两列纵向追加的SQL写法
需求说明
你需要实现的是列转行操作:将源表Table 1中每个ID对应的Name、Position两列值,纵向合并到User Role/Name字段下,每个ID生成2条对应记录。
源表结构与数据:
| ID | Name | Position |
|---|---|---|
| 1 | Mike | Developer |
| 2 | Mark | QA |
期望输出结构:
| ID | User Role/Name |
|---|---|
| 1 | Mike |
| 1 | Developer |
| 2 | Mark |
| 2 | QA |
方案1:全兼容UNION ALL写法(推荐新手使用)
该写法支持所有SQL数据库(MySQL、SQL Server、Oracle、PostgreSQL、SQLite等),逻辑清晰不易出错:
SELECT ID, Name AS `User Role/Name` FROM `Table 1` UNION ALL SELECT ID, Position AS `User Role/Name` FROM `Table 1` ORDER BY ID;
注意:必须使用
UNION ALL而非UNION:UNION会自动对结果去重,若遇到同一ID下Name和Position取值相同的场景会误删有效行;UNION ALL直接拼接结果集,不会丢数据且执行效率更高。
方案2:专用UNPIVOT语法(适用于SQL Server、Oracle)
支持原生UNPIVOT语法的数据库可以使用该写法,执行性能优于UNION ALL:
SELECT ID, `User Role/Name` FROM `Table 1` UNPIVOT ( `User Role/Name` FOR col_type IN (Name, Position) ) AS unpivot_result;
方案3:LATERAL JOIN写法(适用于PostgreSQL、MySQL 8.0+)
支持横向连接的数据库可以使用该写法,适合需要同时拆分列数较多的场景:
SELECT t.ID, v.`User Role/Name` FROM `Table 1` t, LATERAL ( SELECT t.Name AS `User Role/Name` UNION ALL SELECT t.Position AS `User Role/Name` ) v;
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

