簡體   English   中英

在T-SQL中附加數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM