сложный с запросом на SQL Server 2008 - PullRequest
1 голос
/ 17 мая 2011

Не могли бы вы объяснить, что делают эти строки кода?

Таблица 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; Также почему в этом случае их два: 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

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Столбцы таблицы 1 можно игнорировать, поскольку используется только счетчик - таким образом, вы можете переписать свой 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 'сеет' рекурсию - это строка, из которой будут получены последующие уровни рекурсии.Остальные строки создаются из второго запроса, действующего (первоначально) на исходную строку, а затем на результирующую строку второго запроса, возвращаемую в себя и т. Д.

0 голосов
/ 17 мая 2011

Создает common table expression.

Это в основном создает временную структуру таблицы из запроса select внутри.Оператор select выполняет следующие действия:

1) Выбор набора значений по умолчанию 1,1,1, вычисление N.N*(N.N+1)/2 и, наконец, значение из таблицы N N.N
2) UNION в другом операторе select.
3) Второй выбор выполняет некоторый условный вывод с инструкциями case.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...