2015-04-14 2 views
0

Все еще изучаю SQL :) На этот раз я бы хотел, чтобы «связанный список» шел из таблицы, я думаю, используя CTE. Несмотря на весь пример в Интернете, я не мог найти один простой пример, с которого я мог начать с этого момента заглядывать и выталкивать оттуда.ходячий список с использованием cte

Вот мой стол

create table yo (id integer, nx integer) 
select * from yo 
id   nx 
---------- ---------- 
1   5 
2   4 
3   7 
4   9 
5   3 
6   0 
7   0 
8   6 
9   8 

Я хотел бы получить список «ид», «» пх из лет после следующей ссылке «пх» дан старт «идентификатор»

Таким образом, начальный 'id' of 1 будет производить

id   nx 
---------- ---------- 
1   5 
3   7 
5   3 
7   0 

Обратите внимание, что 0 - конечный маркер.

Я не могу найти волшебную SQL для этого Thanx заранее Приветствия, Phi

+0

Мой стол искажен в моем первоначальном вопросе dunno ho w, чтобы отредактировать мой вступительный пост – Phi

+0

Это то же самое, что и типичные отношения родитель/ребенок. в чем именно проблема?: –

+1

Исправлено отображение таблицы в главном вопросе (извините за это). CL нет проблем, (я думаю), но это я начинаю новичком, я пытался «дублировать» пример, данный в сети, но есть слишком сложный вопрос, и я не могу заставить его работать. Я имею в виду, что я не могу обработать инструкцию SQL, чтобы получить список (id, nx), начиная с некоторой точки в цепочке. – Phi

ответ

2

Первая строка списка легко:

SELECT id, nx 
FROM yo 
WHERE id = 1 

Если nx колонна из предыдущая запись доступна как list.nx, следующая запись может быть возвращена с помощью этого запроса:

SELECT yo.id, yo.nx 
FROM yo 
JOIN list ON yo.id = list.nx 

Затем просто подключить их вместе:

WITH RECURSIVE list(id, nx) AS (
    SELECT id, nx 
    FROM yo 
    WHERE id = 1 
    UNION ALL 
    SELECT yo.id, yo.nx 
    FROM yo 
    JOIN list ON yo.id = list.nx 
) 
SELECT * FROM list 

(Это автоматически останавливается, потому что нет строки, где id равен нулю; в противном случае вы могли бы добавить WHERE list.nx != 0.)

+0

Thanx CL, я был почти там, учусь на стыке. Он работает как чемпионы, и я могу обрабатывать круглый список также с WHERE list.nx! = 1 (предполагая, что orignal chanded имеет запись 7, указывающую назад на 1 вместо beiing 0. Again thanx. – Phi

+0

Лучший способ предотвратить бесконечный цикл использует UNION вместо UNION ALL (см. [документация] (http://www.sqlite.org/lang_with.html)). –

Смежные вопросы