ANSI 92再帰SQLステートメントが必要です
-
10-07-2019 - |
質問
現在、SQL ServerのSQLステートメントをANSIの一般的な同等物に変換していますが、WITHステートメントを使用した再帰的なステートメントに固執しています。
問題に集中するために、次のように問題を簡略化します
2つのテーブルがある場合
-
ReportingUnit
- col1:キー
- col2:ParentReportingUnitKey
-
施設
- col1:キー
- col2:ParentReportingUnitKey
この構造は、レポーティング単位の階層を施設まで記述しています。レポーティング単位には、0 .. 1の直接の親レポーティング単位と0 .. nの子レポーティング単位があります。
施設は「リーフ」レコードであり、レポーティング単位にリンクします。
階層内の任意のレポーティング単位に関連するすべての機能を返すANSI 92の有効なSQLステートメント(または最悪の場合、Oracle、DB2、SQL Serverで動作するステートメント)を作成する必要があります。
e.g。
- ReportingUnit R1にはReportingUnitの子R1.1およびR1.2があります
- ReportingUnit R1.1には、R1.1.1、R1.1.2の子があります
-
ReportingUnit R1.2には、R1.2.1、R1.2.2の子があります
-
施設F1には、親レポート単位R1.1.1があります
- 施設F2には親報告単位R1.1.2があります
- 施設F3には親報告単位R1.2.1があります
- 施設F4には親報告単位R1.2.2があります
ReportingUnitテーブルに0 .. nレベルの再帰がある可能性があることを念頭に置いて、パラメータReportingUnit = R1が指定されたSQLステートメントから4つの機能すべてを返すにはどうすればよいですか?
解決
SQL-92では再帰ステートメントが使用できなかったことは、私は許容範囲内です。サポートされた最も古いバージョンはSQL-99でした。
その結果、SQL-92を使用しないことに固執します。なぜSQL-92が望ましいと思いますか? SQL機能の基本レベルですか、それとも他の理由がありますか?
現在のバージョンのDB2にはWITH句があり、再帰クエリを実現できます。 OracleにはWITH句もあると思います。それらを使用して再帰クエリを実現できるかどうかはわかりません。 Oracleには、完全に非標準で非リレーショナルのCONNECT BY PRIORもあります。 MS SQL Serverが何をサポートしているかわかりません。
指定した3つのDBMSでサポートされている単一の構文を見つけることができない可能性がかなり高い。
他のヒント
再帰クエリのSQL-92ソリューションはありません。
最良のオプションは、階層関係をエンコードするためのソリューションの1つを使用して、標準SQLを使用してすべての子孫または祖先を照会できるようにすることです。
ここで簡単な説明を参照してください:" フラットテーブルをツリーに解析する最も効率的でエレガントな方法は何ですか?"。
または" SQL for Smartiesのツリーと階層"ジョー・セルコ。