[解決済み】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"に対する最適化も使用できません。
関連
-
[解決済み] エラー: 名前解析スクリプトで正しい関数に渡された長さのパラメーターが無効です。
-
[解決済み] 時間を時間単位や10分単位でグループ化する方法
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ERROR: 参照されたテーブル "bar" の与えられたキーに一致するユニークな制約がありません。
-
[解決済み] 3を挿入すると「ORA-01438: この列で許容される指定精度より大きい値」と表示される。
-
[解決済み】Teradata - 計算中に数値のオーバーフローが発生しました。
-
[解決済み】BULK INSERTで「予期せぬファイルの終了」エラーが発生したROWを特定する?
-
[解決済み] バックエンドバージョンでは、データベースのダイアグラムやテーブルのデザインはサポートされていません。
-
[解決済み】SQL Server: 無効なカラム名
-
[解決済み] INSERT ステートメントが FOREIGN KEY 制約と競合する - SQL Server
-
[解決済み] ORA-01779: キーが保存されていないテーブルにマップされる列を変更できません。
-
[解決済み] リンクされたサーバーの NULL に対して OLE DB プロバイダー Microsoft.Jet.OLEDB.4.0 のインスタンスを作成できません。
-
[解決済み] "このSqlTransactionは完了しました。もう使用できません。"...設定エラー?