Как я создаю разделенный запятыми список с помощью SQL-запроса?

Большинство дополнительных методов LINQ возвращает результаты. ForEach не вписывается в этот шаблон, поскольку это ничего не возвращает.

53
задан Pac0 18 December 2018 в 06:15
поделиться

9 ответов

There is no way to do it in a DB-agnostic way. So you need to get the whole data-set like this:

select 
  r.name as ResName, 
  a.name as AppName
from 
  Resouces as r, 
  Applications as a, 
  ApplicationsResources as ar
where
  ar.app_id = a.id 
  and ar.resource_id = r.id

And then concat the AppName programmatically while grouping by ResName.

0
ответ дан 7 November 2019 в 08:18
поделиться

Using COALESCE to Build Comma-Delimited String in SQL Server
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

Example:

DECLARE @EmployeeList varchar(100)

SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + 
   CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1

SELECT @EmployeeList
27
ответ дан 7 November 2019 в 08:18
поделиться

MySQL

  SELECT r.name,
         GROUP_CONCAT(a.name SEPARATOR ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name

SQL Server (2005+)

SELECT r.name,
       STUFF((SELECT ','+ a.name
               FROM APPLICATIONS a
               JOIN APPLICATIONRESOURCES ar ON ar.app_id = a.id
              WHERE ar.resource_id = r.id
           GROUP BY a.name
            FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '')
 FROM RESOURCES r

SQL Server (2017+)

  SELECT r.name,
         STRING_AGG(a.name, ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name

Oracle

I recommend reading about string aggregation/concatentation in Oracle.

116
ответ дан 7 November 2019 в 08:18
поделиться

To be agnostic, drop back and punt.

Select a.name as a_name, r.name as r_name
  from ApplicationsResource ar, Applications a, Resources r
 where a.id = ar.app_id
   and r.id = ar.resource_id
 order by r.name, a.name;

Now user your server programming language to concatenate a_names while r_name is the same as the last time.

1
ответ дан 7 November 2019 в 08:18
поделиться

I don't know if there's any solution to do this in a database-agnostic way, since you most likely will need some form of string manipulation, and those are typically different between vendors.

For SQL Server 2005 and up, you could use:

SELECT
     r.ID, r.Name,
     Resources = STUFF(
       (SELECT ','+a.Name
        FROM dbo.Applications a
        INNER JOIN dbo.ApplicationsResources ar ON ar.app_id = a.id
        WHERE ar.resource_id = r.id
        FOR XML PATH('')), 1, 1, '')
FROM
     dbo.Resources r

It uses the SQL Server 2005 FOR XML PATH construct to list the subitems (the applications for a given resource) as a comma-separated list.

Marc

11
ответ дан 7 November 2019 в 08:18
поделиться

Это сделает это в SQL Server:

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + Convert(nvarchar(8),DepartmentId)
FROM Table
SELECT @listStr
1
ответ дан 7 November 2019 в 08:18
поделиться

Предполагая, что SQL Server:

Структура таблицы:

CREATE TABLE [dbo].[item_dept](
    [ItemName] char(20) NULL,
    [DepartmentID] int NULL   
)

Запрос:

SELECT ItemName,
       STUFF((SELECT ',' + rtrim(convert(char(10),DepartmentID))
        FROM   item_dept b
        WHERE  a.ItemName = b.ItemName
        FOR XML PATH('')),1,1,'') DepartmentID
FROM   item_dept a
GROUP BY ItemName

Результаты:

ItemName    DepartmentID
item1       21,13,9,36
item2       4,9,44
5
ответ дан 7 November 2019 в 08:18
поделиться

Я полагаю, что вы хотите:

SELECT ItemName, GROUP_CONCAT(DepartmentId) FROM table_name GROUP BY ItemName

Если вы используете MySQL

Reference

5
ответ дан 7 November 2019 в 08:18
поделиться

Начиная с следующей версии SQL Server вы сможете делать

SELECT r.name,
       STRING_AGG(a.name, ',')
FROM   RESOURCES r
       JOIN APPLICATIONSRESOURCES ar
         ON ar.resource_id = r.id
       JOIN APPLICATIONS a
         ON a.id = ar.app_id
GROUP  BY r.name 

Для предыдущих версий продукта существует множество различных подходов к этой проблеме. Отличный обзор их можно найти в статье: Объединение значений строк в Transact-SQL .

  • Объединение значений, когда количество элементов неизвестно

    • Рекурсивный метод CTE
    • XML-методы черного ящика
    • Использование Common Language Runtime
    • Скалярная UDF с рекурсией
    • UDF с табличным значением с циклом WHILE
    • Динамический SQL
    • Курсорный подход
      .
  • Ненадежные подходы

    • Скалярная UDF с расширением обновления t-SQL
    • Скалярная UDF с конкатенацией переменных в SELECT
4
ответ дан 7 November 2019 в 08:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: