在 Sqldelight 中,WITH RECURSIVE 用于创建递归查询。然而,在某些情况下,它会出现问题。
例如,在以下的代码中:
WITH RECURSIVE temp(num) AS (
SELECT 1 AS num
UNION ALL
SELECT num+1 FROM temp WHERE num<10
)
SELECT * FROM temp;
你可能会遇到这样的错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp, PID: 12345
android.database.sqlite.SQLiteException: no such table: temp: WITH RECURSIVE temp(num) AS …
这个问题是由于 SQLite 在解析递归子句时会按照同步模式进行,而 Sqldelight 中的同步递归模式与 SQLite 中不同。
要解决这个问题,我们可以使用一个中间表来存储递归结果,然后在最终查询中引用它。以下是一个修改后的代码:
WITH temp(num) AS (
SELECT 1 AS num
UNION ALL
SELECT num+1 FROM temp WHERE num<10
)
SELECT * FROM (
SELECT * FROM temp
UNION ALL
SELECT * FROM temp
), temp2;
在这个代码中,我们不再使用 RECURSIVE 关键字,而是将递归结果存储在一个中间表(temp2)中。最终查询引用了中间表和递归表来获取正确的结果。
注意,我们必须在中间表上执行 SELECT * FROM temp 两次以获取正确的结果。