【问题标题】:sqlite CTE with UPDATE带更新的 sqlite CTE
【发布时间】:2020-04-21 05:28:32
【问题描述】:

我希望这不是重复的,我红了一些帖子,但不知道如何解决这个问题。

我有一张这样的桌子

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

我可以像这样使用 CTE 创建一个临时表来获取 col 'pd' 的深度级别

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

然后我想在表 'yo' 中添加一个 col 并在其中输入 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

一切正常。现在我想在 1 个请求中组合临时表“ui”创建和表“yo”更新?

我尝试了很多组合回合都找不到解决方案,我确定这很明显,但我不够流利。

CTE 创建是否应该像

中那样在 UPDATE 之前创建

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

或者应该将 CTE 计算到 UPDATE 内的选择中

感谢任何帮助

干杯, 飞

【问题讨论】:

标签: sqlite sql-update common-table-expression


【解决方案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
  );

【讨论】:

  • Thanx CL,天哪,我确实尝试了这两种可能性,我一定是在某个地方出了点小故障,因为我只将他的整个 col 设置为 1(或 0)或者我挂起(循环)。无论如何感谢吨。干杯,披
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2020-08-02
相关资源
最近更新 更多