2

現在、SQL Server SQL ステートメントを同等の ANSI 汎用ステートメントに変換していますが、WITH ステートメントを使用した再帰ステートメントに悩まされています。

この問題に集中するために、次のように問題を単純化します。

テーブルが 2 つある場合

  1. 報告単位

    • col1: キー
    • col2: ParentReportingUnitKey
  2. 施設

    • col1: キー
    • col2: ParentReportingUnitKey

この構造は、施設までのレポーティング ユニットの階層を記述しています。レポーティング ユニットは、0 .. 1 の直接の親レポーティング ユニットと 0 .. n の子レポーティング ユニットを持つことができます。

施設は、レポーティング ユニットにリンクする「リーフ」レコードです。

ANSI 92 の有効な SQL ステートメント (または、最悪の場合、Oracle、DB2、および SQL Server で動作するもの) を作成する必要があります。これは、階層の任意の場所にある特定のレポート ユニットに関連するすべての機能を返します。

例えば

  • 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 つの機能すべてを返すにはどうすればよいでしょうか?

4

2 に答える 2

3

SQL-92 では再帰ステートメントが使用できなかったことはかなり確信しています。それがサポートされた最も古いバージョンは SQL-99 でした。

その結果、SQL-92 を使用しないことになります。なぜSQL-92が望ましいと思いますか? それは SQL 機能の基本レベルなのでしょうか、それとも何か他の理由がありますか?

現在のバージョンの DB2 には WITH 句があり、再帰クエリを実行できます。オラクルにもWITH句があると思います。それらを使用して再帰クエリを実行できるかどうかはわかりません。Oracle には、完全に非標準で非リレーショナルな CONNECT BY PRIOR もあります。MS SQL Server が何をサポートしているのかわかりません。

指定した 3 つの DBMS のすべてでサポートされている単一の構文を見つけることができない可能性がかなり高くなります。

于 2008-11-24T04:15:35.467 に答える
2

再帰クエリに対する SQL-92 ソリューションはありません。

最適なオプションは、標準 SQL を使用してすべての子孫または祖先を照会できるように、階層関係をエンコードするためのソリューションの 1 つを使用することです。

ここで簡単な説明を参照してください: 「フラット テーブルをツリーに解析する最も効率的/エレガントな方法は?」.

または、Joe Celko による「Smarties のための SQL のツリーと階層」をお読みください。

于 2008-11-24T06:52:11.733 に答える