0

背景:初投稿なのでお手柔らかに!;-) 5 つのテーブルにまたがる SQLite 結合に問題があります。Python を使用して、Raspberry Pi で散水システムを構築しています。次のテーブル構造が SQLite に組み込まれています。

deviceTable - すべての給水装置を一覧表示するテーブル

programTable - すべての散水プログラムを一覧表示するテーブル

zoneTable - すべての給水ゾーンを一覧表示するテーブル

assignProgramTable - 多くの散水プログラムを多くのゾーンに割り当てるためのブリッジ テーブル

assignDeviceTable - 多くの散水ゾーンに多くのデバイスを割り当てるためのブリッジ テーブル。

問題:現在、次のクエリを使用してこれらのテーブルをすべて結合しようとしています。これにより、マルチスレッド Python スクリプトで Raspberry Pi を制御できるようになります...当初、これはネストされた SQL スクリプトとして機能していました (私の Python スクリプトで動的に動作しています) が、データベースの結果内で複数のスレッドを実行しようとすると少し複雑になりました。基本的に、SQL クエリからいくつかのキー値を取得し、

エントリごとに 1 つしかないはずなのに、複数の行が返されているようです。これを処理する最善の方法はありますか? 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"

残念ながら、これによりさらに多くの行が複製されました...まだスタックしています!

4

1 に答える 1

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

これらの 2 つのグループ間に欠落している関係が表示されます。あなたの説明から、私はそれが次のようなものであるべきだと思いますad.zoneID = z.zoneID

于 2013-11-07T10:40:29.320 に答える