1

少し前に、SO のネストされたループについて質問しましたが、例のループ内にクエリがあり、明確な答えが得られました。

ループ内に SQL クエリを入れないでください

それ以来、私は試してきましたが、ほとんどの場合うまくいきます。努力して、必要なものをすべて一度に取得するクエリを作成するだけです。

しかし、ネストされた方法で出力する必要があるネストされたデータを含む JOIN クエリからのデータセットがある場合はどうしますか?

テーブル A と B からの結合の例:

A.a     |  B.a     |  B.b
--------|----------|-------------
fruits  |  banana  |  yellow
fruits  |  apple   |  red
animals |  zebra   |  black&white
animals |  elefant |  gray
animals |  fox     |  red
planets |  earth   |  blue
planets |  mars    |  red

わかりました、配列または行セットですべてを取得したので、次のようなものを表示する必要があります。

果物

  • 黄色いバナナ
  • 赤いリンゴ

動物

  • 黒と白のゼブラ
  • グレーエレファント
  • 赤狐

惑星

  • 青い地球
  • 赤い火星

それが機能することは明らかですが、私は今何度か頭を悩ませようとしましたが、解決策を思いつくことができません.

現時点では、私はそれを私の古い方法で行っています:

クエリ グループ

foreach グループ
{
    グループ内の動物のクエリ
    foreach 動物
}

でもねえ、絶対にSQLをループに入れないでください。じゃあどうすればいいの?私はPHPをやっていますが、これはメタな質問だと思います.

4

2 に答える 2

3

コントロール ブレーク アルゴリズムを使用します。

質問に示されているとおりに結果セットを返します。

A.a     |  B.a     |  B.b
--------|----------|-------------
fruits  |  banana  |  yellow
fruits  |  apple   |  red
animals |  zebra   |  black&white
animals |  elefant |  gray
animals |  fox     |  red
planets |  earth   |  blue
planets |  mars    |  red

すべての行をループします。

  • Aa が変更された場合、タイトルを出力する
  • 次に、常に Bb + Ba 値を出力します

SQL を呼び出すアプリケーションの擬似コード:

set last_A = null
exec query

loop over result set {
    if last_A == null or fetch_A!=last_A {
        last_A=fetch_A
        display fetch_a
    }
    display fetch_Bb + fetch_Ba
    }
}//loop
于 2009-04-22T21:07:29.373 に答える
1

あなたが持っているものが階層である場合、「有向非巡回グラフ」。SQL はこれらを行いません。

SQL が実行しない他のグラフ理論があります。

SQL はこれを行わないため、「SQL をループに入れない」というルールは適用されません。

階層や、ラティスやネットワークが関係するその他のグラフ接続の問題については、SQL をループに入れる必要があります。

実際、階層の場合、再帰ループを使用して、階層のすべての要素を任意の深さに接続する必要があります。

一方、クエリ結果をネストされた階層のように再フォーマットするだけの場合は、単一の SQL 結果セットをネストされたリストのように再フォーマットするだけです。

これは、結果セットの周りに複雑なループがある 1 つの選択になります。ループではなく 1 つの選択と、1 つの結果セットを処理するための複雑なループ。

于 2009-04-22T20:57:49.177 に答える