У меня есть стол A, с колоннами Id
и ParentId
. Учитывая Id
, я хочу вернуть все ParentId
.Использование SQL Server, как вернуть список из цикла While, и должен ли я использовать цикл While?
Значение, дается Id
, я хочу, чтобы вернуть все записи ParentId
, а затем я хочу, чтобы проверить, если записанный ParentId
вводится в таблицу как Id, если это так я хочу найти это ParentId
и т.д. ...
Например, если у меня есть простой пример таблицы, как:
Id | ParentID
---+---------
1 0
2 1
3 2
4 3
5 4
6 5
7 6
Мой запрос на печать всех родителей из Id=7
выглядит следующим образом:
DECLARE @ParentId INT;
SET @ParentId = 7;
WHILE(@ParentId > 0)
BEGIN
SELECT @ParentId = ParentId
FROM A
WHERE Id = @ParentID
PRINT @ParentId
END
Этот запрос распечатывает все ParentId
. Но есть ли способ вернуть идентификаторы? В этом случае, если бы я вызывал этот запрос с PHP, я бы хотел получить список ParentIds, но мой запрос на самом деле ничего не возвращает.
Кроме того, мне интересно, является ли цикл while правильным решением. Будет ли рекурсивный запрос быстрее? Если да, то какие рекомендации о том, как преобразовать это в рекурсивный запрос?
* Редактировать
Мне нужно получить доступ к списку ParentIds из PHP. Теперь я пытаюсь создать список идентификаторов с разделителями-запятыми для возврата из запроса, который я могу позже проанализировать в PHP. Тем не менее, ниже запрос дает мне сообщение об ошибке:
A RETURN statement with a return value cannot be used in this context.
DECLARE @ParentId INT, @ParentList varchar(max);
SET @ParentId = 7;
WHILE(@ParentId > 0)
BEGIN
SELECT @ParentId = ParentId
FROM A
WHERE Id = @ParentID
SET @ParentList = @ParentList | CAST(@ParentId as varchar(20)) | ',';
END
RETURN @ParentList;
Что я должен сделать, чтобы вернуть список? Кроме того, как я могу получить возвращаемое значение при выполнении этого выражения в PHP?
Хотя циклы и рекурсивные вызовы метода эквивалентны. – Jonast92
Являются ли они эквивалентными с точки зрения производительности? – ab11
Цикл while всегда будет страдать от точки зрения производительности. Часто рекурсивный цит не будет страдать от одного и того же штрафа за производительность. Из вашего описания я бы подумал, что рекурсивный cte - это именно то, что вам нужно. –