Конвертировать подзапрос sql в список или varchar - PullRequest
1 голос
/ 10 августа 2010

Я хочу знать, можем ли мы преобразовать результат подзапроса в разделенный запятыми список в типе данных varchar.

Например.Если у меня есть таблица продуктов.И у меня есть таблица изображений продукта с внешним ключом продукта.Теперь я хочу перечислить все продукты с помощью запроса select, который должен иметь столбец со списком pk списка таблицы productImage для каждого продукта.

Я использую sql server 2005. Можем ли мы достичь вышеуказанного каким-либо образом?

Ответы [ 3 ]

10 голосов
/ 10 августа 2010
Select p.ProductID,
       Stuff((Select ','+Cast(ImageID as varchar(10)) 
                From @ProductImages i 
               Where p.ProductID=i.ProductId 
                 For XML PATH('')
             ),1,1,''
            ) as ImageList
  From @Products p
 Where p.ProductID in (Select ProductID From @ProductImages)

Вот тестовые данные, которые я использовал для этого запроса

Declare @Products Table (ProductID int primary key, ProductName varchar(20))        
Declare @ProductImages Table (ProductId int, ImageId int, Primary Key (ProductId, ImageId))

Insert Into @Products 
Select 1, 'Product1' Union all
Select 2, 'Product1' Union all
Select 3, 'Product1' Union all
Select 4, 'Product1' Union all
Select 5, 'Product1' 

Insert Into @ProductImages
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,4 Union all
Select 2,5 Union all
Select 3,1 Union all
Select 4,3 Union all
Select 4,5 

А вот результат запроса:

ProductID ImageList
--------- ---------
        1 1,2,3
        2 4,5
        3 1
        4 3,5

Если вы хотите, чтобы ProductID 5 в спискепри нулевом значении для списка изображений просто удалите следующую строку из запроса:

Where p.ProductID in (Select ProductID From @ProductImages)

У вас будет еще одна строка в результате (для нее не назначены изображения):

        5 null
0 голосов
/ 10 августа 2010

Я не уверен, что слежу за вами, но, возможно, вы можете попытаться добавить дополнительную таблицу:

Таблица Продукт Таблица Таблица изображений Таблица Product_Images.

В этой последней таблице у вас будет как минимум 3 столбца, PK для таблицы Product_Images, Product_FK и Images_FK.Тогда, просто набрав

SELECT Image_FK FROM Product_Images WHERE Product_Images.Product_FK = ##;

, вы получите список PK изображений, связанных с продуктом

Надеюсь, это поможет вам, с уважением.

0 голосов
/ 10 августа 2010

Не легко, нет.Я обнаружил, что лучший способ сделать это состоит в том, чтобы выполнить подзапрос самостоятельно и программно собрать разделенный запятыми список.

Если вам действительно нужно сделать это в базе данных, вы можете определитьскалярная функция, которая может давать значение для внешнего ключа и которая возвращает список через запятую.Вы должны будете использовать курсор внутри этой функции, чтобы волшебство произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...