在 T-SQL 中追加数据
本文关键字:数据 追加 T-SQL | 更新日期: 2023-09-27 18:34:38
我有一个sql(事务处理sql - SQL server 2012(,它用于从具有有效地址的表(客户(中获取客户名称(从表详细信息(:
Select Customer.Name, Details.Address
from Customer
left outer join Details on Details.Customer = Customer.Name
这用于每次从数据库服务器发回每个客户的每条记录(名称(行。不会提取多条记录。
最近我需要修改这个sql文本,以便根据数据库获取他们借阅的书籍的名称,该数据库保存在另一个表(借出(中。现在脚本如下所示:
Select Customer.Name, Details.Address, Lending.BookName
from Customer
left outer join Details on Details.Customer = Customer.Name
left outer join Lending on Lending.CustomerName = Customer.Name
它正在正确返回记录,但现在我遇到了问题。由于客户可以借阅多本书,因此返回的数据具有同一客户的多行,显示多个书籍名称。根据我的软件规范,我需要为每个客户获取一行,并且在该行中,我需要将所有书籍名称附加到一列中。有人可以帮我解决这个问题:如何在一列中为同一记录附加多个数据,例如:
Name Address BookName
Somdip XX Brief History of Time,Headfirst SQL,Headfirst C#
而不是
Name Address BookName
Somdip XX Brief History of Time
Somdip XX Headfirst SQL
Somdip XX Headfirst C#
??
我使用了上面的sql文本和"where"和"order by"子句,例如:
SELECT Name,
Address ,
Split.a.value('.', 'VARCHAR(100)') BookName
FROM (SELECT Name,
Address ,
Cast ('<M>' + Replace(BookName, ',', '</M><M>') + '</M>' AS XML) AS Data
FROM [table] where ID = '1' order by Name) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)
它给了我一个错误:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。
试试这个:
SELECT Name,
Address ,
Split.a.value('.', 'VARCHAR(100)') BookName
FROM (SELECT Name,
Address ,
Cast ('<M>' + Replace(BookName, ',', '</M><M>') + '</M>' AS XML) AS Data
FROM [table]) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)
虽然我认为这通常是一个坏主意 - 在单个单元格中返回多个数据项 - 但有多种方法可以解决这个问题,但具有不同的性能问题。
您要查找的内容在这里:将许多行连接成一个文本字符串?