1

多数の潜在的な入力を含む複雑な検索アプリケーションを構築しています。各入力はオプションです。モジュール方式でクエリを作成しようとしています。

WHEREそれぞれが独立した条件を持つ2つの異なるクエリがあるとしましょう。

SELECT * FROM t1 WHERE t1.c1 = x

SELECT * FROM t2 WHERE t2.c1 = y

次のコードが有効であることがわかりました。

SELECT * FROM t1 INNER JOIN t2 ON t1.c2 = t2.c2 WHERE t1.c1= x AND t2.c1= y

ただし、WHERE条件は最後にグループ化されるため、これをモジュール方式で実装することは非常に困難です。だから、私はこれを試しました:

SELECT * FROM t1 WHERE t1.c1 = x INNER JOIN ON t1.c2 = t2.c2 WHERE t2.c1 = y

ただし、このコードは無効です。任意の数のテーブルを独立したWHERE句で結合するための最良の方法は何ですか?

4

2 に答える 2

0

この状況では、コードでWHERE句を動的に作成します。より良いアプローチがあるかどうかはわかりません。

プリペアドステートメント(パラメータ化されたクエリ)を必ず使用してください。パラメータなしでWHERE句を作成することは、セキュリティ上の大きな問題です。

于 2012-07-10T00:02:10.840 に答える
0

テーブル間の結合は、条件付きで実装できる場合があります-そして、where句は最後に連結されます-次のようになります。

SELECT * 
FROM t1 
  INNER JOIN t2 ON t1.c2 = t2.c2 
  INNER JOIN t3 ON t1.c3 = t3.c3  
  INNER JOIN t4 ON t1.c4 = t4.c4  
WHERE t1.c1 = x 
  AND t2.c2 = y
  AND t3.c3 = z
  AND t4.c4 = a

また、ユーザーが選択したオプションに応じて、条件付きでこれを文字列として作成できます。

where句と一緒に動的に構築するjoinsことは機能するかもしれませんが、注意すべきいくつかの落とし穴があるかもしれません。

まず、結合は、テーブルが結合する自然な方法に基づいてカスタムビルドする必要がある可能性があります。たとえば、結合可能でt3ある場合と結合できない場合がt2ありt1ます。where句についても同様の問題が発生します。各where句は、テーブルの列に応じてカスタムビルドする必要があります。

言い換えれば、この問題が完全に一般化できる可能性は低いです。最終的には、テーブルの詳細に依存するカスタムSQLを作成する必要があります。さらに悪いことに、時間の経過とともにテーブルが変更され、SQLもそれに合わせて変更する必要があります。複雑なSQLを動的に構築している場合は、メンテナンスの問題に直面している可能性があります。

さらに、アプリが大きくなるにつれて、クエリを最適化するために、組み合わせごとにSQLを調整することをお勧めします。これを構築するときは、必ずこれを考慮に入れてください。

于 2012-07-10T00:23:05.893 に答える