Использование нового SQLite С РЕКУРСИВНЫМ предложением CTE

#sql #sqlite #common-table-expression

#sql #sqlite #common-table-expression

Вопрос:

В SQLite 3.8.3 добавлена поддержка CTE. Я попробовал некоторые примеры CTE на этой странице, и они работают нормально. Однако, прочитав документацию и попытавшись адаптировать некоторые примеры, я не могу создать простой тест.

Сначала я создаю простую таблицу с двумя полями: id и parent . Это создаст простое дерево или связанный список записей:

 CREATE TABLE test(id INTEGER PRIMARY KEY ASC,parent INTEGER);
  

Теперь я заполняю его несколькими строками:

 INSERT INTO test (parent) VALUES (NULL); 
INSERT INTO test (parent) VALUES (1); 
INSERT INTO test (parent) VALUES (2); 
INSERT INTO test (parent) VALUES (3); 
  

После чего у меня есть таблица, которая выглядит следующим образом:

 --- -------
id | parent
--- -------
 1 | NULL
 2 |  1
 3 |  2
 4 |  3
  

Теперь я хочу сгенерировать список строк по пути между 3 и 1:

 WITH RECURSIVE test1(id,parent) AS (
    VALUES(3,2) 
    UNION ALL 
    SELECT * FROM test WHERE test.parent=test1.id) 
SELECT * FROM test1;
  

Но я получаю сообщение об ошибке:

 no such column: test1.id
  

Оба test и test1 имеют id поле, так почему же он утверждает, что оно не существует? Я несколько раз просматривал документацию и не вижу своей ошибки. Что я делаю не так?

Ответ №1:

Необходимо включить test1 таблицу в SELECT :

 WITH RECURSIVE test1(id,parent) AS (
    VALUES(3,2)
    UNION ALL 
    SELECT test.id,test.parent FROM test,test1 WHERE test1.parent=test.id)
SELECT * FROM test1;
  

Обратите внимание, что WHERE предложение было отменено, исходный тест в вопросе возвращается из текущей строки в конец, а не из конца обратно в начало.