2015-03-11 2 views
0

Я использую эти коды для получения уровня (глубины) моей таблицы родительских/дочерних категорий. и атрибут IsLeaf:Ошибка при использовании CTE в SQLITE3

with cteCat as (
select 
    id, parent, 
    [cteLevel] = 1 
from Categories 
where 1=1 and parent=0 
union all 
select 
    c.id, c.parent, 
    [cteLevel] = cc.cteLevel+1 
from Categories c 
join cteCat cc 
    on c.parent = cc.id 
where 1=1 
    and c.parent <> 0 
) 
select 
* 
, CASE WHEN EXISTS (SELECT * FROM Categories c2 WHERE c2.parent = c1.id) THEN 0 ELSE 1 END AS IsLeaf 
, (SELECT COUNT(*) FROM Categories c2 WHERE c2.parent = c1.id) AS Leafs 
from cteCat c1 
order by c1.id 

результат:

id  parent cteLevel IsLeaf Leafs 
1  0  1   0  2 
.... 

это нормально в SQLSERVER. но когда я выполняю на sqlite, я получаю сообщение об ошибке:

Error while executing SQL query on database 'ado': 
no such column: cc.cteLevel 

Любая помощь? Благодарю.

+1

'[cteLevel] = 1 'недействительно SQL. Не уверен, поддерживает ли SQLite эти нестандартные '[', но насколько я знаю, он не поддерживает назначение таких переменных, если это не является нестандартным псевдонимом столбца, тогда вам нужно написать '1 как ctelevel' (и конечно, 'cc.ctelevel + 1 как cteLevel' во второй части) –

ответ

1

SQLite не поддерживает назначения переменных, подобные этому.

Однако, вы должны быть в состоянии сделать то же самое со стандартным SQL:

WITH cteCat AS (
    SELECT id, 
     parent, 
     1 AS cteLevel 
    FROM ... 
    WHERE ... 
    UNION ALL 
    SELECT c.id, 
     c.parent, 
     cc.cteLevel + 1 
    FROM ... 
    WHERE ... 
) 
SELECT ... 
Смежные вопросы