【发布时间】:2021-05-15 14:21:16
【问题描述】:
我想连接多行
表:
|id |属性|值| |--------|------------|---------| |101 |经理 |鲁道夫 | |101 |帐户 |456 | |101 |代码 |B | |102 |经理 |安娜 | |102 |卡诺 |123 | |102 |代码 |B | |102 |代码 |C |
我要找的结果是:
|id |经理|帐户|Cardno|代码| |--------|--------|--------|------|----------| |101 |鲁道夫 |456 | |B | |102 |安娜 | |123 |B,C |
我有来自related question 的以下代码:
select
p.*,
a.value as Manager,
b.value as Account,
c.value as Cardno
from table1 p
left join table2 a on a.id = p.id and a.attribute = 'Manager'
left join table2 b on b.id = p.id and b.attribute = 'Account'
left join table2 c on c.id = p.id and b.attribute = 'Cardno'
但是,对于 ID# 102 的 Code 属性,它会失败,其中 B 和 C 值都存在。
如何更新它以将这两个值包含在同一结果中?
【问题讨论】:
-
啊,可怕的 EAV 模式反模式。有时你种下什么就收什么。您想要的每个字段都是返回到同一个表的另一个连接,对于
(102,Code),您可能会使用 string_agg()。此外,我们需要确切了解您使用的是哪种数据库,因为正确的解决方案将取决于数据库类型和版本,因为一些数据库在最近的版本中添加了工具来帮助解决这个问题. -
这是 Microsoft SQL Server 2012
-
我忘记了一件重要的事情。我是 SQL 的初学者。也许这比我想象的要复杂。
-
好吧,
string_agg()直到 Sql Server 2017 才可用。那仍然会很痛苦(你需要按每一列分组),但没有它你'将不得不以非常困难的方式做到这一点。 -
谢谢乔尔。我对第一个问题有点混搭。我一直在使用 Excel,但我必须承认 SQL 有很多优势。猜猜我必须在 Excel 中完成这项工作。再次非常感谢。
标签: sql sql-server sql-server-2012 concatenation