如何在可变列数据上设置 SQLite 连接

Posted

技术标签:

【中文标题】如何在可变列数据上设置 SQLite 连接【英文标题】:How to setup SQLite Join on variable column data 【发布时间】:2012-11-16 08:14:27 【问题描述】:

我有 2 张桌子。一个表包含一个人的姓名和该人的唯一 ID。另一张表有多个列,但有一列特别存储了此人的唯一 ID。

到现在为止,第二个表始终存储一个 ID,因此我能够轻松地对这两个表执行 JOIN 并获得我需要的数据,如下所示:

SELECT DISTINCT personTable._id, personTable.name FROM dataTable LEFT OUTER JOIN personTable ON dataTable.person_id = personTable._id

但是,一项新要求开始发挥作用,现在将允许第二个表在同一列中引用多个 ID。换句话说,表格过去严格来说是这样的:

2ND TABLE COLUMN PERSON'S ID = 5

但是现在存储可以这样

2ND TABLE COLUMN PERSON'S ID = 5-6
2ND TABLE COLUMN PERSON'S ID = 5-3-8-2
2ND TABLE COLUMN PERSON'S ID = 5 (still valid)

使用这种新格式,我每次都无法成功查询数据。如何更新此查询以正常工作?我在 android 中使用 SQLite。感谢您的帮助。

【问题讨论】:

当他们弄乱你的桌子完整性时,你为什么不反对? ;) 是否有任何表只携带人员数据? (例如Person父表)按照新的结构,你的dataTable的person ID应该也更新了吧? 相信我,我不喜欢这些变化! PERSON 表仅由人员数据组成。 dataTable 的人员 ID 不会更改,它只是将其数据扩展。创建 dataTable 时,dataTable 的人员 ID 列设置为 TEXT。因此,当添加新行时,新要求不是只添加单个人员 ID,而是表示 dataTable 可以有多个与行关联的 PERSON,因此他们只想在两者之间添加一个破折号(即“-”)每个人的 ID。 【参考方案1】:

如果你使用新格式,你不会走得太远。

要为新规范提供服务,您应该将架构更改为多一张用作连接表的表。

总共有 3 个表格,如下所示:

CREATE TABLE persontable (
    person_id INTEGER PRIMARY KEY,
    name VARCHAR(32),
    -- more person fields...
)

CREATE TABLE datatable (
    data_id INTEGER PRIMARY KEY,
    join_id INTEGER,
    -- more datatable fields...
)

CREATE TABLE jointable (
    join_id INTEGER PRIMARY KEY,
    person_id INTEGER
)

Jointable 将根据您的需要为每个用户提供尽可能多的行,例如对于

第二个表列人的 ID = 5-3-8-2

它将有 4 行。

现在,您可以拥有如下数据:

SELECT d.*,
    p.name,
    ...
FROM datatable d
    JOIN persons p USING (person_id)
    JOIN jointable j USING (join_id)
WHERE d.some_field = 'blah'

【讨论】:

谢谢mvp!我无法完全按照您的建议进行设置,但您的回答帮助我了解了一种更好的方法来解决这个问题。但我的实现将与您上面的类似。再次感谢!

以上是关于如何在可变列数据上设置 SQLite 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何将新列添加到 Android SQLite 数据库?

django 如何在 SQLite 中删除列

SQLIte如何设置自动增长的字段?

如何在Sqlite的数据库表中添加其他列?

如何计算 sqlite 数据库中打开的连接数?

PySpark:如何在宽度可变的列数组上聚合?