1. ホーム
  2. sql

[解決済み】SQL WHERE ID IN (id1, id2, ..., idn)

2022-04-09 02:55:24

質問

IDの大きなリストを取得するクエリを書く必要があります。

私たちは多くのバックエンド(MySQL、Firebird、SQLServer、Oracle、PostgreSQLなど)をサポートしているので、私は標準的なSQLを書く必要があります。

IDセットのサイズは大きくなる可能性があり、クエリはプログラムによって生成されるでしょう。そこで、最良の方法は何でしょうか?

1) INを使ったクエリを書く

SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)

ここで質問です。nが非常に大きい場合、どうなるのでしょうか?また、パフォーマンスについてはどうでしょうか?

2) ORを使ったクエリの書き方

SELECT * FROM TABLE WHERE ID = id1 OR ID = id2 OR ... OR ID = idn

この方法はnの制限がないと思いますが、nが非常に大きい場合の性能はどうでしょうか?

3) プログラムによる解決策を書く。

  foreach (var id in myIdList)
  {
      var item = GetItemByQuery("SELECT * FROM TABLE WHERE ID = " + id);
      myObjectList.Add(item);
  }

この方法では、ネットワーク経由でデータベースサーバーに問い合わせをしたときに、いくつかの問題が発生しました。通常、小さなクエリをたくさん作るよりも、1つのクエリですべての結果を取得する方が良いのです。もしかしたら、私が間違っているのかもしれません。

この問題に対する正しい解決策は何でしょうか?

どのように解決するのですか?

オプション1が唯一の良い解決策です。

なぜ?

  • オプション2も同じですが、カラム名を何度も繰り返すことになります。さらに、SQLエンジンは、値が固定リストの値の1つであるかどうかをチェックしたいことをすぐに知ることができません。しかし、優れたSQLエンジンであれば、これを最適化して IN . 読みやすさの問題は残るけど...。

  • オプション3は、単純にパフォーマンス的に最悪です。ループごとにクエリを送信し、小さなクエリでデータベースを酷使します。また、quot;value is one of those in a given list"に対する最適化も使用できません。