おはよう!一対多の関係が発生する可能性があるキーの一意のリストを維持するためのトリックを探しています。
問題
私は職場で恐ろしく正規化されていないデータベースを使用していますが、残念ながら再設計は問題外です。これに似た多数の推移的および部分的なキーの依存関係を含む 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
の関係を維持できる限り、どのレコードを取得するかはあまり気にしません。Group
Group_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 ソリューションと同等かそれ以上に実行されることに疑いの余地はありません。この問題に関する皆様のご支援に感謝いたします。