#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
предложение было отменено, исходный тест в вопросе возвращается из текущей строки в конец, а не из конца обратно в начало.