3

Oracle RDMS は、set 演算子を含むビューをマージできないことを知っています。それはなぜなのか知りたいです。

たとえば、次のようになります。

SELECT u.*
FROM
 (
  SELECT a.a1    A,
        a.a2    B
   FROM tab_a a
UNION ALL
  SELECT b.b1    A,
         b.b2    B
    FROM tab_b b
)     u,
tab_p p
WHERE p.a = u.a

これに変換できます:

SELECT *
FROM
 (
  SELECT a.a1    A,
         a.a2    B
    FROM tab_a a,
         tab_p p
   WHERE p.a = a.a1
UNION ALL
  SELECT b.b1    A,
         b.b2    B
    FROM tab_b b,
         tab_p p
   WHERE p.a = b.b1
)

これら 2 つのクエリは同等ですよね? [編集]

4

3 に答える 3

3

クエリは同じ結果セットを生成しますが、実行計画は異なる可能性があります。tab_p最初のクエリは、2 番目のクエリの 2 回に対して 1 回と比較しているため、より効率的であることが期待されます。


以前は、どちらのクエリも SELECT * を使用しており、どちらにもテーブル エイリアスはありませんでした。

いいえ、これらのクエリは同等ではありません。

1 つ目は、派生テーブル (UNION ステートメント) とテーブルの両方から列を返しますtab_p。2 番目のクエリは、派生テーブル (UNION ステートメント) からの値のみを返し、tab_pテーブルからの列は返しません。の代わりにテーブルのエイリアスを置き換えると、より明白になりますSELECT *

最初のクエリ:

SELECT u.*, p.*
  FROM (SELECT a.a1    A,
               a.a2    B
          FROM tab_a a
        UNION ALL
        SELECT b.b1    A,
               b.b2    B
          FROM tab_b b) u,
       tab_p p
 WHERE p.a = u.a

2 番目のクエリ:

SELECT x.*
 FROM (SELECT a.a1    A,
              a.a2    B
         FROM tab_a a,
              tab_p p
        WHERE p.a = a.a
       UNION ALL
       SELECT b.b1    A,
              b.b2    B
         FROM tab_b b,
              tab_p p
        WHERE p.a = b.a) x

tab_p外側のクエリが最終的な結果セットに提供するため、内側のクエリの SELECT 句には列がありません。

これ:

SELECT *
  FROM (SELECT a.a1    A,
               a.a2    B
          FROM tab_a a
        UNION ALL
        SELECT b.b1    A,
               b.b2    B
          FROM tab_b b) u
  JOIN tab_p p ON p.a = u.a

..最初のクエリと同等です。最初のクエリで使用されている ANSI-89 構文に対して、ANSI-92 結合構文を使用しています。

于 2010-09-28T19:19:05.703 に答える
2

編集した質問で説明した変換は、私には有効に見えます。

Oracle オプティマイザが理論上実行できるクエリ変換は数多くありますが、実際には、これは Oracle チームが実際にわざわざ実装した変換に限定されます。

各変換が追加された場合、コーディングとテストに多額の投資が必要になり、有料市場で十分な需要が検出された場合にのみ実行されます.

したがって、必ずしも「できない」わけではありません。まだそうではありません。

于 2010-09-29T03:08:25.947 に答える
0

それらは同等ではありません。uが定義されていないため、2 番目のクエリは失敗します。

于 2010-09-28T19:18:37.177 に答える