1

おはよう!一対多の関係が発生する可能性があるキーの一意のリストを維持するためのトリックを探しています。

問題

私は職場で恐ろしく正規化されていないデータベースを使用していますが、残念ながら再設計は問題外です。これに似た多数の推移的および部分的なキーの依存関係を含む 1NF マスター テーブルがあります。

Cmpd_Key  Group  Subgroup   Group_Desc
  A1    |   A   |    1   |    Same
  A2    |   A   |    2   |    Same
  B1    |   B   |    1   |    Same1
  B2    |   B   |    2   |    Same1
  C1    |   C   |    1   |    Diff1
  C2    |   C   |    2   |    Diff2  <---This field contains multiple values

IDの一意のリストを取得する必要があることがよくありGroupますが、通常は要件によってフィールドも要求Group_Descされます。残念ながら、アップストリームのデータ入力制限が不十分なため、この説明フィールドには複数のエントリが含まれる可能性があり、ほとんどのデータ プルでフィールドが一意である必要がGroupあるため、重複が発生する可能性があります。Group私の目的では、 1対 1Group_Descの関係を維持できる限り、どのレコードを取得するかはあまり気にしません。GroupGroup_Desc

Inline View大規模なクエリでフィールドを参照する必要があるときはいつでもとして参照する醜い解決策を思いつきましたGroup_Descが、これはパフォーマンスを低下させます。

SELECT Group, Group_Desc
FROM Table t
WHERE Subgroup = (SELECT MIN(Subgroup)
                  FROM Table
                  WHERE Group = t.Group) --Nasty Correlated Subquery

質問

同じクエリ内で複数の値の単一行を繰り返しプルバックするためのパフォーマンスに適したトリックを誰かが持っていますか? 引き戻しGroupて、最初Group_Descに表示されるものだけを表示できるようにしたいと思います。

私は次のようなものを想定しています:

SELECT Group, Group_Desc
FROM Table t
GROUP BY Group, Group_Desc    
HAVING ROWNUM = [The lowest returned Rownum within the same Group]

仲間の開発者がこのRANK関数を可能な解決策として挙げましたが、それを使用して値を削除する方法がわかりませんでした。

あなたが提供できるどんな助けも大歓迎です!

- - - - - - - - 編集 - - - - - - - - - - -

そのため、追加の分析を行った結果、元の相関サブクエリの省略が原因で実行プランが過度に長くなっていることを突き止めることができました。いくつかの述語を追加することで、オプティマイザーはより良い計画を作成することができ、実行時間が約 12 分から 2 分に短縮されました。これは私の期待に沿ったものです。

私は、Ponder Stibbons が以下で提案した Analytics ソリューションをかなり試しました。彼のソリューションは非常に洗練されており、この質問の回答として選択しましたが、主に自分で利用できたインデックスが原因で、元のソリューションよりも実行時間が大幅に遅かったため、この特定のクエリでは使用できませんでした。相関サブクエリ。

公正な比較において、Analytics ソリューションが Correlated SubQuery ソリューションと同等かそれ以上に実行されることに疑いの余地はありません。この問題に関する皆様のご支援に感謝いたします。

4

1 に答える 1