如何在可变列数据上设置 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 连接的主要内容,如果未能解决你的问题,请参考以下文章