将 2 个“一对多”表中的记录转置为一条记录

Posted

技术标签:

【中文标题】将 2 个“一对多”表中的记录转置为一条记录【英文标题】:Transpose records from 2 "one to many" tables into one record 【发布时间】:2013-12-31 19:12:32 【问题描述】:

基本上,我想得到一个类似这样的记录集:

CustomerID, CustomerName, OrderNumbers
1           John Smith    112, 113, 114, 115
2           James Smith   116, 117, 118

目前我正在使用 Sql Server UDF 来连接订单 #s。

有更有效的解决方案吗?

【问题讨论】:

你不应该那样做。保留你的两张桌子。以后反而会让你头疼。就像你违反了第一范式一样。 en.wikipedia.org/wiki/First_normal_form @brunch875 我不认为他想将这两个表进行物理组合,我认为他只是想像上面那样显示一个查询,可能是出于报告原因。 是的,只是出于报告原因显示。我现在正在考虑在应用程序级别而不是 DB 上组合记录集。 @David 我会尝试做一些与这个问题的公认答案类似的事情:***.com/questions/194852/… 【参考方案1】:

1) There are allot of solutions.

2) 示例(SQL2005+):

DECLARE @Customer TABLE (
    CustomerID INT PRIMARY KEY,
    Name NVARCHAR(50) NOT NULL
);
INSERT @Customer VALUES (1, 'Microsoft');
INSERT @Customer VALUES (2, 'Macrosoft');
INSERT @Customer VALUES (3, 'Appl3');

DECLARE @Order TABLE (
    OrderID INT PRIMARY KEY,
    CustomerID INT NOT NULL -- FK
);
INSERT @Order VALUES (1, 1);
INSERT @Order VALUES (2, 2);
INSERT @Order VALUES (3, 2);
INSERT @Order VALUES (4, 1);
INSERT @Order VALUES (5, 2);

SELECT  c.CustomerID, c.Name, oa.OrderNumbers
FROM    @Customer AS c
/*CROSS or */OUTER APPLY (
    SELECT STUFF((
        SELECT ',' + CONVERT(VARCHAR(11), o.OrderID) FROM @Order AS o
        WHERE o.CustomerID = c.CustomerID
        -- ORDER BY o.OrderID -- Uncomment of order nums must be sorted
        FOR XML PATH(''), TYPE
    ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS OrderNumbers
) oa;

输出:

CustomerID  Name      OrderNumbers
----------- --------- ------------
1           Microsoft 1,4
2           Macrosoft 2,3,5
3           Appl3     NULL

【讨论】:

以上是关于将 2 个“一对多”表中的记录转置为一条记录的主要内容,如果未能解决你的问题,请参考以下文章

sql 一对多关系随机查一条

mysql学习之路_高级数据操作

Laravel - 以一对多关系获取最后一条记录

多表查询

选择一对多关系中的最后一条记录

Razor Pages - 一对多关系