2013-07-10 2 views
0

Учитывая, что один из многих, где Элемент может быть во многих Складках, делает прямое объединение, возвращает повторяющиеся элементы. Я хотел бы свернуть данные из таблицы хранилища в строки так, чтобы была одна запись за элемент. Это работает, но существует ли более эффективный подход, который позволяет избежать двух отдельных подзапросов/подзапросов?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 имеет количество 8 пункта 2? – 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

Edit: Я хотел бы добавить, что это, вероятно, лучше всего быть сделано на уровне приложений, или даже CLR. Суть в том, что это не одна из сильных сторон SQL Server, и вам, вероятно, придется попробовать несколько методов, чтобы увидеть, что лучше всего подходит для вашей среды. Если вы в основном относитесь к удобочитаемости, скалярный метод udf, вероятно, будет выглядеть самым чистым, но может и не быть наиболее масштабируемым.

+0

Спасибо за ответ! До сих пор я пытался переходить на использование CTE для предоставления данных, которые извлекается подзапросом, и не было существенной разницы в показателях ввода-вывода или времени. Фактически, статистика IO была идентичной между 2. Я также рассмотрю использование UDF и других ссылок. – RyanW