[英]Appending data in T-SQL
我有一個sql(transact sql - SQL server 2012),用於從具有有效地址的表(Customer)中獲取客戶名稱(來自表詳細信息):
Select Customer.Name, Details.Address
from Customer
left outer join Details on Details.Customer = Customer.Name
這用於每次從數據庫服務器發回每個客戶的每個記錄(名稱)行。 沒有提取多個記錄。
最近我需要修改這個sql文本,以便獲取他們根據數據庫借用的書籍的名稱,該書籍保存在另一個表格(Lending)中。 現在腳本看起來像:
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)
雖然我認為這通常是一個壞主意 - 在單個單元格中返回多個數據項 - 有很多方法可以解決它,但存在不同的性能問題。
您正在尋找的是:將多行連接成一個文本字符串?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.