背景:第一篇帖子让我轻松一点! ;-)我在5个表中使用SQLite连接时遇到了一些问题。我正在使用Python在我的Raspberry Pi上构建一个浇水系统,并在SQLite中构建了以下表结构:
deviceTable - 表列出了所有浇水设备
programTable - 列出所有浇水程序的表格
zoneTable - 列出所有浇水区的表格
assignProgramTable - 用于为许多区域分配许多浇水程序的桥接表
assignDeviceTable - 用于将许多设备分配到多个浇水区域的桥接表。
问题:我目前正在使用以下查询尝试将所有这些表连接在一起,以便我可以开始使用多线程Python脚本控制我的Raspberry Pi ...我最初这个作为一个嵌套的SQL脚本(在我的Python脚本中动态工作),但是当尝试在数据库结果中运行多个线程时,它有点复杂。基本上我计划从SQL查询和
中获取一些关键值当每个条目只应该有一行时,似乎会返回多行..是否有最好的方法来处理这个问题?我发现了一些建议使用DISTINCT选项的答案(虽然不起作用),虽然我会以最好的方式进行此操作吗?
SELECT *
FROM deviceTable AS d, programTable AS p
JOIN assignDeviceTable AS ad ON d.deviceID = ad.deviceID
JOIN zoneTable AS z ON z.zoneID = a.zoneID
JOIN assignProgramTable AS a ON p.programID = a.programID
where p.programStatus = "1"
按照LS_dev的建议,我已将查询更新为以下内容:
SELECT *
FROM deviceTable AS d, programTable AS p, assignDeviceTable AS ad, zoneTable AS z, assignProgramTable AS ap
JOIN deviceTable ON d.deviceID = ad.deviceID
JOIN assignDeviceTable ON ad.zoneID = z.zoneID
JOIN zoneTable ON z.zoneID = ap.zoneID
JOIN assignProgramTable ON ap.programID = p.programID
where p.programStatus = "1"
不幸的是,这导致更多的行被复制......仍然卡住了!
答案 0 :(得分:3)
在SQLite中,
与JOIN
相同。
因此,您的查询与以下所示相同:
SELECT *
FROM deviceTable AS d
JOIN programTable AS p -- missing ON p.some_id=d.some_id
JOIN assignDeviceTable AS ad ON d.deviceID = ad.deviceID
JOIN zoneTable AS z ON z.zoneID = a.zoneID
JOIN assignProgramTable AS a ON p.programID = a.programID
where p.programStatus = "1"
您有5个表但只有3个连接约束。通常Nconstraints = Ntables - 1
。
分析你们的关系:
programTable p deviceTable d
/ \ / \
(p.programID=a.programID) (d.deviceID=ad.deviceID)
\ / \ /
assignProgramTable a assignDeviceTable ad
/ \
(z.zoneID=a.zoneID)
\ /
zoneTable z
可见您错过了这两个组之间的关系。根据你的解释,我认为应该是ad.zoneID = z.zoneID
。