SQLite:将行重复n次到表的末尾,但有一些更改的数据?

问题描述 投票:0回答:1

我有一个名为“场景”的表...

id   created       modified      scene_id
------------------------------------------
1    1999-11-31    2000-01-27    ABCD
2    2000-12-31    2001-01-27    EFGH
3    2001-12-31    2002-01-27    IJKL
4    2002-12-31    2003-01-27    MNOP
5    2003-12-31    2004-01-27    QRST

...我想做的是在表末尾复制一行(本例中为第 2 行)n 次(本例中为 4 次),同时也更改 scene_id 以赋予它们唯一的标识符。这是一个简短的解释,但原来是一个大约有 50 列的大表,我想将一些行分成单独的部分,以获得如下所示的内容:

id   created       modified      scene_id
------------------------------------------
1    1999-11-31    2000-01-27    ABCD
2    2000-12-31    2001-01-27    EFGH
3    2001-12-31    2002-01-27    IJKL
4    2002-12-31    2003-01-27    MNOP
5    2003-12-31    2004-01-27    QRST
6    2000-12-31    2001-01-27    EFGH-A
7    2000-12-31    2001-01-27    EFGH-B
8    2000-12-31    2001-01-27    EFGH-C
9    2000-12-31    2001-01-27    EFGH-D

我首先将一些信息保存在一个名为“变量”的临时表中

CREATE TEMP TABLE variables (
    scene_id TEXT, 
    num_files INT,
    scene_index INT
);
INSERT INTO variables VALUES (
  'EFGH',
  4,
  2
);
SELECT * FROM variables;
scene_id    num_files   scene_index
------------------------------------
EFGH        4           2

我还将第 2 行存储在名为“dupedScene”的表中

CREATE TEMP TABLE dupedScene AS SELECT * FROM scenes WHERE id = (
    SELECT scene_index FROM variables
);
UPDATE dupedScene 
    SET id = NULL; -- reset id column to trigger auto increment
SELECT * from dupedScene
id     created       modified      scene_id
-------------------------------------------
null   2000-12-31    2001-01-27    EFGH

然后我尝试了各种方法使用递归 CTE 和 JOIN 来“循环”INSERT INTO,但我正在努力让这些东西一起工作。我已经做到了这一点,但我不断收到一般错误:

WITH RECURSIVE
counter(x) AS (
    SELECT 1
      UNION ALL
    SELECT x + 1
    FROM counter
    WHERE x < (SELECT num_files FROM variables)
)
INSERT INTO scenes
  SELECT * FROM dupedScene
  JOIN counter ON x

有SQL高手可以帮忙吗?

sql sqlite recursion join common-table-expression
1个回答
0
投票

查询将是

INSERT INTO scenes
WITH RECURSIVE
counter(x) AS (
    SELECT 1
      UNION ALL
    SELECT x + 1
    FROM counter
    WHERE x < (SELECT num_files FROM variables)
)
  SELECT * FROM dupedScene
  JOIN counter ON x

但是您尝试将 5 列插入到场景中,但这很容易修复

参见https://www.db-fiddle.com/f/jLbLD5eiRV8gKYc4RrB6o3/0

© www.soinside.com 2019 - 2024. All rights reserved.