在多行SQLite表

时间:2016-07-01 13:43:31

标签: list sqlite duplicates

我想管理包含各种条目的列表。目前我使用的是以下表结构。

CREATE TABLE lists (
    list_id INTEGER,
    sort_id INTEGER,
    content_id INTEGER,
    PRIMARY KEY (list_id,sort_id)
)

所以我可以使用以下方式调用个人列表:

SELECT content_id WHERE list_id=<<X>> ORDER BY sort_id

原则上添加新列表不是问题,但如何在插入新的列表集之前检查完整列表的重复项?我举个例子:

已插入以下列表:

list_id | sort_id | content_id
--------+---------+-----------
    3   |    1    |     7
    3   |    2    |     4
    3   |    3    |     9

包含内容7,4,9的新列表将是重复的,不得插入。但由于我对不同的列表内容的定义,内容4,7,9或7,4或7,4,9,5必须是插入的。

我想添加一个新表,其中包含列表的连接内容,如:

CREATE TABLE lists_concat (list_id PRIMARY KEY, content_concat UNIQUE)

因此,对于我的例子,将有条目

list_id | content_concat
--------+---------------
    3   |     7,4,9

这可行,但似乎非常复杂。有没有更简单的方法?我也愿意为我的列表使用另一个表结构。请告诉我你的想法。

非常感谢

1 个答案:

答案 0 :(得分:1)

如果

,则两个列表相等
  1. sort_id s的数量相等,如果
  2. 所有sort_id匹配的值,即没有匹配sort_id但不同值的行。
  3. 假设新列表存储在单独的表中:

    CREATE TEMPORARY TABLE new_list ( sort_id, content_id );
    

    您可以搜索以下重复项:

    SELECT list_id
    FROM (SELECT DISTINCT list_id
          FROM lists) AS L1
    WHERE (SELECT COUNT(*)
           FROM lists as L2
           WHERE L2.list_id = L1.list_id
          ) =
          (SELECT COUNT(*)
           FROM new_list
          )
      AND NOT EXISTS (SELECT 1
                      FROM lists AS L3
                      JOIN new_list ON L3.list_id = L1.list_id
                                   AND L3.sort_id = new_list.sort_id
                      WHERE L3.content_id != new_list.content_id);