mysql> SELECT * FROM nodes
-> WHERE hostName IN ('localhost', 'm1iafw') OR
-> address IN ('localhost', 'm1iafw');
+----------------------+-----------+-----------+
| id | hostName | address |
+----------------------+-----------+-----------+
| 9131891219333790492 | NULL | m1iafw |
| 15289714606300179720 | localhost | NULL |
| 15886756565768587967 | m1iafw | 10.7.7.12 |
| 18400354826544934228 | m1iafw | NULL |
+----------------------+-----------+-----------+
上記は、私が取り組んでいるクエリの簡略化されたバージョンです。IN
ホスト名のリストを何度も繰り返す必要がないように、これを 1 つのオペレーターで書きたいと思います。リストには何百ものホスト名が含まれる可能性があります。
私が欲しいのは次のようなものです:
SELECT * FROM nodes
WHERE (hostName, address) INTERSECTS ('localhost', 'm1iafw');
INTERSECT が提供するような一致する値のリストは必要ありません。INのようにブール値の結果が必要です。セットが交差するかどうか。
また、MySQL は INTERSECT 演算子をサポートしていません。いいえ。通常のアドバイスは、結合を使用して INTERSECT を別の形式に書き直すことですが、2 つのテーブルを交差させていないため、その方法がわかりません。
さらに、私が本当にやりたいことは、もう少し複雑です。上部のクエリからノードの ID 番号を指定して、一致するものを別のテーブルで検索したいと思います。3 つの列のいずれかに、一致する ID の 1 つが含まれている可能性があります。私の架空の INTERSECTS 演算子を使用すると、クエリを次のように記述できます。
SELECT * FROM alerts
WHERE (analyzerNodeId, sourceNodeId, targetNodeId) INTERSECTS
(SELECT id FROM nodes
WHERE (hostName, address) INTERSECTS ('localhost', 'm1iafw'));
これを行う方法について何か提案はありますか? 私の SQL-fu はそれほど強力ではありません。