:OracleのSELECT(INTERSECTの選択肢は)
たちは、約100の温度リーダーとの大きな建物があり、それぞれが温度毎分を収集想像してみてください。
私は、次の列ではなく、大規模なテーブル(〜100メートル)の行があります。
表のTempEvents:
Timestamp - one entry per minute
Reader ID - about 100 separate readers
Temperature - Integer (-40 -> +40)
タイムスタンプおよびReader IDはテーブルに二+主キーです。
reader_01 = 10度、
reader_02 = 15度、
_read_03 = 20度のすべてのタイムスタンプを検索するクエリを実行します。言い換えれば
このような何か:タイムスタンプのリストで結果の
SELECT Timestamp FROM TempEvents
WHERE (readerID=01 AND temperature=10)
AND (readerID=02 AND temperature=15)
AND (readerID=03 AND temperature=20)
==>:単一の行がすべての条件が含まれていないので、
Timestamp::
2016-01-01 05:45:00
2016-02-01 07:23:00
2016-03-01 11:56:00
2016-04-01 23:21:00
は、上記のクエリは何も返しません一度。条件の間にORを使用すると、すべてのリーダが条件に一致する必要があるため、望ましい結果が得られません。
INTERSECTを使用して、私がで結果を得ることができます。
SELECT * FROM
(SELECT Timestamp FROM TempEvents WHERE readerID=01 AND temperature=10
INTERSECT SELECT Timestamp FROM TempEvents WHERE readerID=02 AND temperature=15
INTERSECT SELECT Timestamp FROM TempEvents WHERE readerID=03 AND temperature=20
)
GROUP BY Timestamp ORDER BY Timestamp ASC;
上記のクエリは非常に高価であり、実行するのに約5分かかります。
結果を得るための方がいい(早く)方法はありますか?
SELECTタイムスタンプFROM TempEvents ここで(readerID = 01 AND temperature = 10) OR(readerID = 02 AND temperature = 15) OR(readerID = 03 AND temperature = 20)? – neutrino
わかりませんが、何について: 'SELECT Timestamp FROM TempEvents WHERE(readerid、temperature)IN((1,10)、(2,15)、(3,20)) グループby readerid、温度 count (別個のリーダーID)= 3; ' –
上記の問題について正直言って、最も簡単なのは@neutrinoが提案したものです。彼のソリューションを使用しているときに得られる問題は何ですか? – XING