android - Sqlite限制具有相同id的重复行

标签 android database sqlite android-sqlite common-table-expression

我正在使用 android SQLite 数据库,结果如下:

 id | root_id | parent_id   |name
----------------------------------
613 | null    | null        | m1
612 | null    | null        | m4
570 | null    | null        | m1
635 | 570     | 570         | m6
653 | 570     | 635         | m1
652 | 570     | 635         | m3
632 | 570     | 570         | m9
392 | null    | null        | m2
753 | 392     | 392         | m5
751 | 392     | 392         | m4
391 | null    | null        | m7

我通过以下查询得到了这个结果:

WITH RECURSIVE all_employees(id, root_id, parent_id, name) AS (
    SELECT id, id AS root_id, parent_id, name FROM employees WHERE parent_id IS NULL
    UNION ALL
    SELECT c.id, (CASE WHEN c.parent_id IS NOT NULL THEN p.root_id END), c.parent_id, c.name FROM employees c JOIN all_employees p ON p.id = c.parent_id ORDER BY id DESC
)

SELECT id, (CASE WHEN id != root_id THEN root_id ELSE NULL END) root_id, parent_id, name FROM all_employees

我想为具有相同 root_id 的重复行设置限制,例如: 加载 root_id 570 的 2 行和 root_id 392 的 1 行:

 id | root_id | parent_id   |name
----------------------------------
613 | null    | null        | m1
612 | null    | null        | m4
570 | null    | null        | m1
635 | 570     | 570         | m6
653 | 570     | 635         | m1
392 | null    | null        | m2
753 | 392     | 392         | m5
391 | null    | null        | m7

最佳答案

创建另一个CTE:

counters(root_id, n) AS (VALUES (570, 2), (392, 1)) 

在其中返回您想要限制其行数的所有 root_id 以及每个 root_id 的行数,然后使用递归LEFT 连接>CTE 到此。
最后,使用相关子查询在 WHERE 子句中设置条件:

WITH 
  RECURSIVE all_employees(id, root_id, parent_id, name) AS (
    SELECT id, id AS root_id, parent_id, name 
    FROM employees 
    WHERE parent_id IS NULL
    UNION ALL
    SELECT c.id, (CASE WHEN c.parent_id IS NOT NULL THEN p.root_id END), c.parent_id, c.name 
    FROM employees c JOIN all_employees p 
    ON p.id = c.parent_id 
  ),
  counters(root_id, n) AS (VALUES (570, 2), (392, 1))
SELECT a.id, (CASE WHEN a.id <> a.root_id THEN a.root_id END) root_id, a.parent_id, a.name
FROM all_employees a LEFT JOIN counters c
ON c.root_id = a.root_id
WHERE c.root_id IS NULL 
   OR (SELECT COUNT(*) FROM all_employees b WHERE b.root_id IS a.root_id AND b.id <= a.id) <= c.n

请注意,CTE 中的 ORDER BY 子句是无用的,因为当您从 中选择时,不能保证按该顺序返回行。 >CTE
您可以设置最终查询中所需的行顺序。

关于android - Sqlite限制具有相同id的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68343060/

相关文章:

java - 如何获取JSON数组内部的JSON对象

Android Studio 将 libapp.so 添加到生成的 apk 中,它是什么以及如何关闭它?

android - 如何找到启动状态栏通知的应用程序

sql - Flutter从SQLite提取数据到对象/模型

android - 弄清楚sqlite android查询的麻烦

android - 使用 ContentProvider 插入时的 CASE 表达式

java - 使用 Android-M 数据绑定(bind)应用的单行字体不起作用

mysql - 加速 : query with a GROUP BY

java - 加密数据库中数据的安全应用程序的体系结构

python - Django:用于开发的 sqlite,用于生产的 mysql?