1

t1, t2, t3Oracleコンテキストに3つのテーブルがあります。次の構造を持つそれらを呼び出しましょう:

  • t1 : t1_ID, t1_name, ...
  • t2 : t1_ID, t3_name, ...
  • t3 : t3_name, randomCol1, randomCol2, randomCol3, ...

私が欲しいのは、次のような結果が得られるクエリです。

t0_name | ランダム列

だから私はこのクエリを作成しました:

      SELECT t1.t1_name, t3.randomCol1 AS randomCol
      FROM t1
      JOIN t2 ON t1.t1_ID=t2.t1_ID
      JOIN t3 ON t2.t3_name=t3.t3_name
      WHERE t3.randomCol1 LIKE '_%'
    UNION
      SELECT t1.t1_name, t3.randomCol2 AS randomCol
      FROM t1
      JOIN t2 ON t1.t1_ID=t2.t1_ID
      JOIN t3 ON t2.t3_name=t3.t3_name
      WHERE t3.randomCol2 LIKE '_%'
    UNION
      SELECT t1.t1_name, t3.randomCol3 AS randomCol
      FROM t1
      JOIN t2 ON t1.t1_ID=t2.t1_ID
      JOIN t3 ON t2.t3_name=t3.t3_name
      WHERE t3.randomCol3 LIKE '_%'

_単一の列で始まる randomCols のすべての値が必要だったので、それらにリンクされた t1_name とペアになっています。より多くの情報を提供するために、randomCol1 と randomCol2 はほぼ同じです (どちらも同時に null ではなく、ほぼ同じ値を持ちます)、randomCol3 は通常 null です。


これはパフォーマンスの面でひどいことを知っているので、改善しようとしました。

したがって、このソリューションを最適化するさまざまな方法 (UNION ALL などを使用するなど) を Web で検索しましたが、必要な正確な結果は得られませんでした。

私の質問は次のとおり です。このクエリを最適化する方法を教えてください。

よろしく

4

3 に答える 3

1

SQL Serverでは、次のようになります

SELECT t0_name, randomCol
FROM (SELECT t0_name, randomCol1, randomCol2, etc)
      FROM t0
      JOIN t01 ON t0.t0_ID=t1.t0_ID
      JOIN t1 ON t01.t1_name=t1.t1_name) p
UNPIVOT (randomCol FOR items in (randomCol1, randomCol2, etc)) unpvt
WHERE randomCol like '_%'

Oracleでも同じだと思います:この記事を参照してください

于 2013-04-18T15:32:50.523 に答える