一尘不染

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

sql

我有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。谢谢你的帮助。


阅读 120

收藏
2021-05-16

共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'
2021-05-16