任意のクエリの結果を返すすべての値の新しいテーブルを提供する一連のクエリを効率的に実行する方法を見つけようとしています。
テーブルに次のようなスキーマがあるとします。
- ID
- 名前
- 年
- 街
任意のクエリ (例: SELECT * FROM main WHERE NOT city=X AND age BETWEEN Y AND Z
) に対して結果を返すすべての値を一覧表示する効率的な方法は何ですか?
これに対する私の単純なアプローチは、スクリプトを使用して {city, age, age} のすべての可能な組み合わせを再帰的に実行し、どの SELECT が 0 を超える結果を返すかを確認することですが、それは非常に非効率的です。{city, age, age} にも大きな結合を作成し、基本的にそのテーブルをクエリの引数リストとして使用しようとしましたが、多くの列に対するクエリではすぐに不可能になります。
単純な結合等価クエリ (例: SELECT * FROM main WHERE name=X AND age=Y
) の場合、次のようなことができるので、これははるかに簡単です。
SELECT name, age, count(*) AS count FROM main GROUP BY name, age HAVING count > 0
しかし、それよりも複雑なものに対する一般的なアプローチを考え出すのは困難です。
正しい方向へのポインタは最も役に立ちます、ありがとう。
編集:
説明が下手だったようです、すみません。
ユーザーがデータベースとテンプレート クエリを渡され、「このデータベースから結果を生成する、このクエリで使用できるすべての値を教えてください」と言ったとします。たとえば、ユーザーは、少なくとも 1 つの行を返すすべての年齢範囲クエリを知りたい場合があります (たとえば、テンプレート クエリは ですSELECT * FROM main WHERE age BETWEEN X AND Y
)。
その特定の例では、SELECT を実行してデータベース内の最小/最大年齢を検索し、それらの年齢の間でクエリを実行するようにユーザーに指示するだけです。
のように、クエリ テンプレートがより複雑であると想像してくださいSELECT * FROM main WHERE NOT city=W AND age BETWEEN X AND Y AND name LIKE Z
。このクエリで結果を返すために使用できる W/X/Y/Z 値の範囲を決定するにはどうすればよいでしょうか? {city, age, age, name} の組み合わせごとに結合テーブルを作成し、各行で SELECT を実行する必要がありますか? 大規模なデータベースで操作が時間制限されるように、これを効率的に行うにはどうすればよいですか?
うまくいけば、それはそれを明確にします。