2015-06-22 5 views
0

Надеюсь, это не дубликат, я несколько красных сообщений, но не мог понять, как это исправить.sqlite CTE с UPDATE

У меня есть таблица, как этот

CREATE TABLE yo (ad INTEGER PRIMARY KEY, pa INTEGER, pd INTEGER); 

INSERT INTO yo VALUES 
(1,1,1),(2,1,3),(3,1,4),(4,3,5),(5,4,2),(6,3,8),(7,1,9),(8,6,7),(9,3,6); 
.header on 
.mode column yo 
select * from yo; 

ad   pa   pd 
---------- ---------- ---------- 
1   1   1 
2   1   3 
3   1   4 
4   3   5 
5   4   2 
6   3   8 
7   1   9 
8   6   7 
9   3   6 

Я могу создать временную таблицу с помощью КТР для получения уровня глубины в седловине «полидисперсность», как этот

CREATE table ui AS 
WITH RECURSIVE ui(a,l) AS 
(VALUES(1,0) 
    UNION ALL 
    SELECT yo.ad, ui.l+1 
     FROM yo JOIN ui ON yo.pa=ui.a 
     WHERE yo.pa!=yo.ad 
    ORDER BY 2 desc 
) 
    SELECT a,l FROM ui; 

select * from ui; 

a   l 
---------- ---------- 
1   0 
2   1 
3   1 
4   2 
5   3 
6   2 
8   3 
9   2 
7   1 

Затем я хочу добавить col to table 'yo' и введите th ui.l там

ALTER TABLE yo ADD COLUMN lv INTEGER; 
UPDATE yo SET lv= 
    (SELECT ui.l 
    FROM ui 
    WHERE ui.a=yo.ad); 

select * from yo; 
ad   pa   pd   lv 
---------- ---------- ---------- ---------- 
1   1   1   0 
2   1   3   1 
3   1   4   1 
4   3   5   2 
5   4   2   3 
6   3   8   2 
7   1   9   1 
8   6   7   3 
9   3   6   2 

Все работает нормально. Теперь мне нравится комбинировать временную таблицу «ui» create и table «yo» update в 1 запросе?

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

Если создание КТР быть перед UPDATE как в

How to use CTE's with update/delete on SQLite?

Или КТР вычисляться в отборное внутри UPDATE

Thanx заранее для любой помогает

Приветствия , Phi

ответ

1

Эта работа:

WITH RECURSIVE ui(a,l) AS 
(VALUES(1,0) 
    UNION ALL 
    SELECT yo.ad, ui.l+1 
    FROM yo JOIN ui ON yo.pa=ui.a 
    WHERE yo.pa!=yo.ad 
    ORDER BY 2 desc 
) 
UPDATE yo SET lv= 
(SELECT ui.l 
    FROM ui 
    WHERE ui.a=yo.ad); 

Это тоже работает:

UPDATE yo SET lv= 
    (WITH RECURSIVE ui(a,l) AS 
    (VALUES(1,0) 
    UNION ALL 
    SELECT yo.ad, ui.l+1 
     FROM yo JOIN ui ON yo.pa=ui.a 
     WHERE yo.pa!=yo.ad 
    ORDER BY 2 desc 
    ) 
    SELECT ui.l 
    FROM ui 
    WHERE ui.a=yo.ad 
); 
+0

Thanx CL, господи я сделал попробовать два варианта, я, должно быть, немного глюк где, потому что я получил только он весь Col установлен в 1 (или 0) OR У меня есть зависание (петля). Во всяком случае, для этого нужно. Cheers, Phi – Phi