从 SQL Server 中具有公共 ID 的多条记录中选择数据

Posted

技术标签:

【中文标题】从 SQL Server 中具有公共 ID 的多条记录中选择数据【英文标题】:To select data from multiple records in SQL Server having a common ID 【发布时间】:2020-04-21 11:59:55 【问题描述】:

我需要从使用左连接的 SQL Server 中的 2 个表中选择/合并数据,但数据作为多条记录返回。

以下是示例表

Table1
Id Name Age
1  Sk   20
2  Rb   30

Table2
ID Bike Price Table1Id
1  RX   200   1
2  CD   250   1
3  FZ   300   1
4  R1   400   2

The desired output is
ID Name Age Bike1 Price1 Bike2 Price2 Bike3 Price3
1  Sk   20  RX    200    CD    250    FZ    300
2  Rb   30  R1    400    NULL  NULL   NULL  NULL

我正在使用的查询的示例格式

SELECT A.ID, A.Name, B.Bike, B.Price FROM Table1 A LEFT JOIN Table2 B ON
A.id = B.Table1Id order by A.id

我从上述查询中得到的输出是

ID Name Age Bike Price
1  Sk   20  RX   200
1  Sk   20  CD   250
1  Sk   20  FZ   300
2  Rb   30  R1   400

我需要将数据作为特定 ID 的一条记录,而不是多条记录(如所需输出所示)。厌倦了使用偏移量,但偏移量只会返回有限的结果而不是整个记录。

关于如何实现这一点有什么建议吗?

【问题讨论】:

如果有超过三辆自行车怎么办? 我知道最多有三辆自行车 【参考方案1】:

如果你知道每人的最大自行车数量,你可以使用条件聚合:

SELECT ID, Name,
       MAX(CASE WHEN seqnm = 1 THEN Bike END) as bike_1,
       MAX(CASE WHEN seqnm = 1 THEN Price END) as price_1,
       MAX(CASE WHEN seqnm = 2 THEN Bike END) as bike_2,
       MAX(CASE WHEN seqnm = 2 THEN Price END) as price_2,
       MAX(CASE WHEN seqnm = 3 THEN Bike END) as bike_3,
       MAX(CASE WHEN seqnm = 3 THEN Price END) as price_3
FROM (SELECT A.ID, A.Name, B.Bike, B.Price,
             ROW_NUMBER() OVER (PARTITION BY A.id ORDER BY B.Price) as seqnum
      FROM Table1 A LEFT JOIN
           Table2 B 
           ON A.id = B.Table1Id 
     ) ab
GROUP BY ID, Name,
ORDER BY id

【讨论】:

以上是关于从 SQL Server 中具有公共 ID 的多条记录中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL Server 在一行中检索特定 id 的多条记录

在 SQL Server 中使用 value() 从 xml 列获取多条记录

SQL Server 中是不是有一种方法可以显示两个具有相同布局并共享一些公共数据的表之间的字段差异

SQL Server - 带有 PARTITION 的 ROW_NUMBER(),如何获取多条记录?

使用引用表 SQL Server 更新表中的多条记录

使用 for 循环将多条记录插入 SQL Server 数据库