Как правильно перевести 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 |
+---------------------------------+