SQL新手求助:连接含转置数据的两张表未得到预期结果
解决转置表与常规表的连接问题
首先得把转置的表2转换成常规的行结构,再和表1关联,具体步骤如下:
1. 转换表2的结构
表2是转置格式,只有value有值的列才会填数据,我们可以用UNION ALL把它拆成每行对应一个属性的格式(这个写法兼容绝大多数SQL数据库):
SELECT id, '属性1' AS attribute, col1 AS value FROM 表2 WHERE col1 IS NOT NULL UNION ALL SELECT id, '属性2' AS attribute, col2 AS value FROM 表2 WHERE col2 IS NOT NULL UNION ALL SELECT id, '属性3' AS attribute, col3 AS value FROM 表2 WHERE col3 IS NOT NULL -- 表2有多少个属性列就加多少条SELECT语句
要是你用的是SQL Server这类支持UNPIVOT的数据库,也可以用更简洁的写法:
SELECT id, attribute, value FROM 表2 UNPIVOT ( value FOR attribute IN (col1, col2, col3) -- 把括号里的换成表2实际的属性列名 ) AS unpivoted_t2
2. 关联表1和转换后的表2
把上面转换后的表2和表1通过id字段连接,用左连接可以保留表1的所有记录,同时匹配表2的属性数据:
SELECT t1.id, t1.name, -- 替换成表1的实际字段 t2.attribute, t2.value FROM 表1 t1 LEFT JOIN ( -- 这里放上面转换表2的SQL SELECT id, '属性1' AS attribute, col1 AS value FROM 表2 WHERE col1 IS NOT NULL UNION ALL SELECT id, '属性2' AS attribute, col2 AS value FROM 表2 WHERE col2 IS NOT NULL UNION ALL SELECT id, '属性3' AS attribute, col3 AS value FROM 表2 WHERE col3 IS NOT NULL ) t2 ON t1.id = t2.id ORDER BY t1.id, t2.attribute;
注意事项
- 把代码里的
表1、表2换成你的实际表名,col1/col2换成表2的属性列,属性1/属性2换成对应列的真实属性名称 - 如果只需要保留表1中存在对应属性数据的记录,把
LEFT JOIN改成INNER JOIN就行
内容的提问来源于stack exchange,提问作者sanras
相关产品推荐
相关产品推荐

