0

任意にネストされた副選択を持つSQLSELECT式が与えられた場合、副選択を含まず、同じ結果セットを返すように、その SQL 式を常に書き直すことができますか?

もしそうなら、そうするためのアルゴリズムはありますか?

SELECTそうでない場合、書き直すことができない式の特徴はありますか?

SELECTSQLステートメントを生成するアプリケーションを作成しています。この時点でどのように動作するかをまだ設計中です。ただし、一般的な考え方は次のとおりです。

ユーザーは、どの列を表示するか、結果をどのように並べ替えるか、どのように制限するかを選択します。

列は単なる SQL 列ではなく、複数のテーブルからの列変数を含む SQL 式をオブジェクトに含めることができる名前付きオブジェクトになります。これらのオブジェクトには、互いに結合する方法に関する情報が含まれます。

これらの式の構成をできるだけ柔軟にしたいと考えています。何らかの結果セットを返す SELECT ステートメントを記述できるのであれば、アプリケーションがを返すステートメントSを生成できるようにしたいと考えています。SQL で可能なことの 1 つは、副選択です。サブセレクトを JOINS で書き直すと、パフォーマンスが向上することを読みました。したがって、構成でサブセレクトを禁止することを検討しています。ただし、すべてのサブ選択を結合として書き換えることができない限り、これを行いたくありません。SELECTS

4

1 に答える 1

1

特に集計関数が使用されている場合は、WHERE 句のサブセレクトを JOIN として書き直すことができないことがよくあります。

ここから引用:

これは、結合では実行できない一般的な形式のサブクエリ比較の例です。テーブル t2 の最大値と等しいテーブル t1 のすべての値を検索します。

SELECT column1 FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2);

別の例を次に示します。これも、テーブルの 1 つを集計する必要があるため、結合では不可能です。2 回出現する値を含むテーブル t1 のすべての行を検索します。

SELECT * FROM t1 WHERE 2 = (SELECT COUNT(column1) FROM t1);

したがって、SELECT 句自体の複雑な副選択の WHERE 句に副選択がある場合、それを JOIN として表現することは不可能です。

SELECT T2.B, (SELECT A from t1 where t1.ID=T2.ID 
                         and 2=(SELECT COUNT(A) from t1 as TX WHERE TX.A=T1.A))
FROM T2
于 2012-09-02T03:22:32.237 に答える