2013-07-10 15 views
0

給定一個對多個倉庫中的項目可以進行一對多的操作,直接連接會返回重複的項目。我想將倉庫表中的數據摺疊爲字符串,以便每個項目有一個記錄。這有效,但有沒有更有效的方法,避免做2個獨立的子查詢/子查詢?SQL Server將多個列摺疊爲一個字符串,從一個到多個關係

SELECT 
    im.ItemID, 
    (SELECT WareHouseID + ',' 
     FROM stockStatusSummary WHERE ItemKey = im.ItemKey for xml path ('')) 
    as 'WarehouseIDs', 
    (SELECT Convert(varchar(20), Round(QtyAvailable,3)) + ',' 
     FROM stockStatusSummary 
     WHERE ItemKey = im.ItemKey for xml path ('')) 
    as 'WarehouseQuantity' 
FROM item im 

隨着輸出看起來像這樣:

ItemID WarehouseIDs WarehouseQuantity 
------- ------------- ----------------- 
1  10,20,30,  5,7,9, 
2  20,30,40,  6,8,10, 
3  30,40,50,  7,9,11, 
+0

您是否期待兩組列表中的條目順序相關,例如:倉庫30有第2項的數量8? – HABO

+0

是的,那很理想。可能需要在來自stackStatus Summary的查詢中顯式排序。 – RyanW

+0

這個問題的重複? http://stackoverflow.com/questions/5452681/sql-aggregating-strings-together – tgolisch

回答

1

是不是真的會成爲具有金襯裏,未經測試的方法。你可以嘗試一種不同的方法來看看它是否值得。我可能會從標量udf方法開始,看看它是否值得。還要確保訂購你的數據,所以結果是一致的。

你可以在這裏,找到http://jahaines.blogspot.in/2009/06/concatenating-column-values-part-1.html更詳細..以下是一些性能測試,http://jahaines.blogspot.in/2009/07/concatenating-column-values-part-2.html

編輯: 我想補充一點,這將可能是最好的應用層來完成,甚至CLR。最重要的是,這不是SQL Server的優勢之一,您可能需要嘗試一些方法來查看哪種方法最適合您的環境。如果您主要關注可讀性,則標量udf方法可能看起來最清晰,但可能不一定是最可擴展的。

+0

感謝您的回答!到目前爲止,我已經嘗試轉換爲使用CTE來提供子選擇檢索的數據,並且在IO或時間統計中沒有顯着差異。事實上,IO的統計數據在2之間是相同的。我會看看使用UDF和其他鏈接。 – RyanW

相關問題