1

これらのコード行は何をするのか説明していただけますか?

表1:INT、VARCHAR、FLOAT

ID Name  value
---------------------------
1   a1  32116580
2   a2  50785384
3   a3  54327508
4   a4  61030844

;with coords(i,row,col,total,N) as (
select 1,1,1,N.N*(N.N+1)/2, N.N
from (select count(*) N from table1) N
union all
select i+1,
       case when col+1>N then row+1 else row end,
       case when col+1>N then row+1 else col+1 end,
       total, N
from coords
where i<total
)

withは、より大きなクエリで使用するための補助ステートメントを作成する方法を提供していることを知っているので、使用する変数を宣言するようなものですが、その後は少し混乱しcaseますrow and col... また、なぜ2つある場合: case when col+1>N then row+1 else、SQLはどのように知っていますかwhen to do one case or the other?...

i  row col total N
--------------------
1   1   1   10   4
2   1   2   10   4
3   1   3   10   4
4   1   4   10   4
5   2   2   10   4
6   2   3   10   4
7   2   4   10   4
8   3   3   10   4
9   3   4   10   4
10  4   4   10   4
4

2 に答える 2

2

カウントのみが使用されているため、table1の列は無視できます。したがって、CTEを次のように書き換えることができます。

;with coords(i,row,col,total,N) as (
    select 1, 1, 1, 10, 4
    union all
    select i+1,
           case when col+1>N then row+1 else row end,
           case when col+1>N then row+1 else col+1 end,
           total, N
    from coords
    where i<total
    )
SELECT * FROM coords

...SELECT * FROM coords結果を視覚化するためにそこにあります。

再帰のselect 1, 1, 1, 10, 4「シード」-これは、後のレベルの再帰が派生する行です。残りの行は、(最初​​は)シード行に作用する2番目のクエリから構築され、次に2番目のクエリからの結果の行がそれ自体にフィードバックされます。

于 2011-05-16T23:02:21.403 に答える
0

を作成していcommon table expressionます。

基本的には、select内のクエリから一時的なテーブル構造を作成します。selectステートメントは次のことを行っています。

1)一連のデフォルト値1,1,1と計算N.N*(N.N+1)/2を選択し、最後にN表から値を選択しますN.N
。2)UNION別のselectステートメントで実行します。
3)2番目の選択は、caseステートメントを使用して条件付き出力を実行します。

于 2011-05-16T22:46:13.147 に答える