SQL Server: объединить строки в одну строку без подзапроса - PullRequest
0 голосов
/ 07 мая 2018

Таблица объявлений

| id |
+----+
| 1  |
| 2  |

Таблица конфликтов

| declarationId | title  |
+---------------+--------+
| 1             | qqq    |
| 1             | wwww   |
| 2             | ttttt  |

Запрос с подзапросом

SELECT 
    dd.[Id],
    (SELECT ',' + Title 
     FROM [dbo].[Conflicts] cc 
     WHERE cc.DeclarationId = dd.Id 
     FOR XML PATH(''))
FROM 
    [dbo].[Declarations] dd

Результат

| 1  | ,qqq,wwww, |
| 2  | ,ttttt,    |

Как добиться того же результата без подзапроса?

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

Ответы [ 3 ]

0 голосов
/ 07 мая 2018
 WITH CTE_TableName AS 
 (
    SELECT DeclarationId, Title
      FROM Conflicts 
  )
 SELECT t0.DeclarationId
        ,STUFF((
        SELECT ',' + t1.Title
          FROM CTE_TableName t1
         WHERE t1.DeclarationId = t0.DeclarationId
        ORDER BY t1.Title
        FOR XML PATH('')), 1, LEN(','), '') AS Titles
  FROM CTE_TableName t0
 GROUP BY t0.DeclarationId
 ORDER BY DeclarationId;
0 голосов
/ 07 мая 2018

Лучшим вариантом для создания объединения или выбора без использования подзапроса является создание пользовательской функции, как указывалось ранее.

Создайте пользовательскую функцию, как показано ниже:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION AppendString()
RETURNS varchar(100)
AS
BEGIN
    DECLARE @temp VARCHAR(50);

    SELECT @temp = ',' + Title 
    FROM [dbo].[Conflicts] cc 
    WHERE cc.DeclarationId = dd.Id 
    FOR XML PATH('')

    RETURN @temp
END
GO

Затем используйте функцию в вашем операторе соединения

SELECT 
    dd.Id, AppendString AS Title 
FROM 
    Declarations DD
INNER JOIN 
    Conflicts CC ON DD.Id = CC.declarationId
0 голосов
/ 07 мая 2018

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

...