2014-07-02 2 views
0

У меня есть таблица, которая имеет следующие столбцы: id, text, parentid. И когда строка является корневым элементом (не имеет родительского элемента), то parentid = 0.Реализация какого-то простого цикла в SQLite

Что я хочу сделать, это найти text первого корня (корень корня из ... корня элемента) определенного элемента.

Вот пример:

SELECT parentid FROM cat WHERE id = 1234 --returns 1120 
SELECT parentid FROM cat WHERE id = 1120 --returns 1011 
SELECT parentid FROM cat WHERE id = 1011 --returns 0. So this the first root. 
SELECT text FROM cat WHERE id = 1011 --returns what I want. 

Я знаю, что это легко можно с петлями, но я использую sqlite, который не поддерживает петли.

Итак, вопрос в том, есть ли способ реализовать это в sqliteбез использования каких-либо других скриптов?

+0

Вы можете использовать [рекурсивное ОТВ] (http://sqlite.org/lang_with.html) – Blorgbeard

+0

@Blorgbeard Я не могу Понимаете, как это работает. Не могли бы вы объяснить это немного подробнее и опубликовать его в качестве ответа? –

+0

К сожалению, в этом примере что-то не так. (Последний запрос, номер должен быть 1101 не 1120) Я только что отредактировал его. –

ответ

2

Этот рекурсивный CTE даст вам желаемый результат. Пожалуйста, обратите внимание, что в КТР доступны только в последних версиях SQLite, начиная с version 3.8.3

;with cte as (
    select id, parentid, text, 1 level 
    from t where id = 1234 
    UNION all 
    select t.id, t.parentid, t.text, cte.level + 1 
    from cte inner join t on cte.parentid = t.id 
    where cte.parentid <> 0) 
select * from cte where parentid = 0 
+0

Благодарим за упоминание необходимой версии SQLite. Мне пришлось обновлять мои библиотеки SQLite. –

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