Могу ли я сделать рекурсивный SELECT в базе данных T-SQL - PullRequest
6 голосов
/ 27 февраля 2012

Я не уверен, возможно ли это в базе данных SQL Server?

Скажем, у меня есть таблица:

id INT
nm NVARCHAR(256)
cid INT --references [id]

и гипотетические данные:

id   nm       cid
1    Name 1   0
2    Name 2   0
3    Name 3   1
4    Name 4   3
5    Name 5   2
6    Name 6   4
7    Name 7   2

И логика для выбора должна быть следующей:

  1. Скажем, у нас есть оригинальный идентификатор, назовем его N.

  2. Тогдау нас есть идентификатор поиска, назовем его X. Затем мы делаем:

    SELECT [cid] FROM [TableName] WHERE [id]=X
    

и проверяем, равен ли результат N. Если да, то мы возвращаем [nm] дляэта запись.Если результат равен 0, то мы возвращаем Null.Если результат - это что-то еще, мы делаем тот же выбор, за исключением того, что X теперь является значением результата.

Я, очевидно, могу сделать это с C #, но мне любопытно, можно ли это обернуть в чистый оператор SQL?

PS.Просто чтобы проиллюстрировать это моей таблицей выше, если N равно 1, а X равно 6, то мы получим:

SELECT [cid] FROM [TableName] WHERE [id]=6    --results is 4 (not N or 0, then continue)
SELECT [cid] FROM [TableName] WHERE [id]=4    --results is 3 (not N or 0, then continue)
SELECT [cid] FROM [TableName] WHERE [id]=3    --results is 1 (is N, then return "Name 1")

или, если N равно 1 и X равно 7, мы получим:

SELECT [cid] FROM [TableName] WHERE [id]=7    --results is 2 (not N or 0, then continue)
SELECT [cid] FROM [TableName] WHERE [id]=2    --results is 0 (is 0, then return Null)

РЕДАКТИРОВАТЬ: Мне нужно это для запуска под SQL Server 2008.

1 Ответ

16 голосов
/ 27 февраля 2012

Рекурсивные CTE могут сделать это.Это выглядело бы так:

WITH q AS (
    SELECT t.id, t.name, t.cid
    FROM t
    WHERE t.id = @x
    UNION ALL
    SELECT t.id, t.name, t.cid
    FROM q
    INNER JOIN t
    ON t.id = q.cid
)
SELECT name
FROM q
WHERE id = @n

Идея состоит в том, что CTE может ссылаться на себя во второй части предложения UNION ALL и будет оценивать вторую часть до тех пор, пока больше не будет генерировать результаты,или достигнут внутренний предел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...