尝试5表连接时重复行

时间:2013-11-07 08:36:32

标签: sql sqlite

背景:第一篇帖子让我轻松一点! ;-)我在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"

不幸的是,这导致更多的行被复制......仍然卡住了!

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