Как правильно перевести MySQL-запрос в MSSQL-запрос, используя GROUP_CONCAT

Я пытаюсь преобразовать MySQL DB в MSSQL DB, но я экспериментирую с некоторыми проблемами при переводе запросов, в частности со следующими:

MySQL

SELECT GROUP_CONCAT( parent.Name
ORDER BY parent.Lft
SEPARATOR  "«" ) AS Path, node.Description
FROM  `DB`.`Categories` AS node,  `DB`.`Categories` AS parent
WHERE node.Lft BETWEEN parent.Lft AND parent.Rgt AND node.ID = 2
GROUP BY node.Name, node.ID
ORDER BY node.Lft LIMIT 1;

И результат, который я получил, это то, что я хочу получить:

+-------------------------------+
| Path                          |
+-------------------------------+
| Master Node « Vehicles « Cars |
+-------------------------------+

MS SQL

Я попытался воссоздать запрос MySQL, используя предложения из этого поста /questions/42455525/imitatsiya-funktsii-mysql-groupconcat-v-microsoft-sql-server-2005/42455565#42455565

SELECT STUFF((SELECT  ' « ' + [Name] FROM [DB].[dbo].[Categories] FOR XML PATH ('')), 1, 1, '') AS [Path] 
FROM [DB].[dbo].[Categories] AS node, [DB].[dbo].[Categories] AS parent 
WHERE node.[Lft] BETWEEN parent.[Lft] AND parent.[Rgt] AND node.[ID] = 7 
GROUP BY node.[Name], node.[ID], node.[Lft] ORDER BY node.[Lft];

И результат, который я получил, не зависит от того, какой идентификатор я выберу:

+---------------------------------------------+
| Path                                        |
+---------------------------------------------+
| « Master Node « Vehicles « Cars « Computers |
+---------------------------------------------+

На данный момент я создаю только таблицу с 4 записями: главный узел, транспортные средства, автомобили и компьютеры; только для тестирования.

Я не знаю, что мне не хватает. У кого-нибудь есть предложение?

Заранее спасибо.

2 ответа

Проблема в том, что вам не хватает критериев в части пути XML:

SELECT 
  STUFF((
    SELECT  ' « ' + [Name] 
    FROM [DB].[dbo].[Categories] C 
    WHERE C.ID = node.ID -- a criteria here is needed to get correct rows
  FOR XML PATH ('')), 1, 1, '') AS [Path] 
FROM 
  [DB].[dbo].[Categories] AS node, 
  [DB].[dbo].[Categories] AS parent 
WHERE 
  node.[Lft] BETWEEN parent.[Lft] AND parent.[Rgt] AND 
  node.[ID] = 7 
GROUP BY 
  node.[Name], 
  node.[ID], 
  node.[Lft] 
ORDER BY 
  node.[Lft];

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

Здесь я размещаю правильный запрос.

SELECT STUFF((SELECT CAST(' « ' AS varchar(MAX)) + parent.name
  FROM Categories AS node, Categories AS parent
 WHERE node.[Lft] BETWEEN parent.[Lft] AND parent.[Rgt]
   AND node.[ID] = 7
 ORDER BY node.lft
   FOR XML PATH('')), 1, 1, '') as Path

Единственное, что я не могу удалить, это первое ""

+---------------------------------+
| Path                            |
+---------------------------------+
| « Master Node « Vehicles « Cars |
+---------------------------------+
Другие вопросы по тегам