2016-04-28 4 views
1

Я считаю себя достаточно опытным в написании операторов SQL, но отнюдь не экспертом. Мне нужно работать с заявлением, которое кто-то создал и не может полностью следовать тому, что они сделали, может кто-нибудь помочь мне понять? Это может быть просто над моей головой:Невозможно расшифровать инструкцию SQL

... 
from 
    (
     select 
      2000+(t*10+u) as `year` 
     from 
     (select 0 t union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) A, 
     (select 0 u union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) B 
     where 
      (2000+(t*10+u)) >= @minYear 
      and (2000+(t*10+u)) <= @maxYear 
    ) innerSelect 
... 

@maxYear и @minYear я могу следовать, но 2000+(t*10+u) и select 0 u union select 1... это то, что меня смущает.

ответ

3

Это всего лишь один из многих трюков для создания таблицы последовательных чисел. В этом случае от minYear до maxYear тех пор, пока они находятся за пределами 2000 года

См http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1

раздел: Создание последовательности из 1000 чисел

Это, вероятно, легче понять, если учесть, что следующее

select t,u 
from 
(select 0 t union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) A, 
(select 0 u union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) B 

генерирует все комбинации между числами от 0 до 9:

0,0 
0,1 
0,2 
... 
1,0 
1,1 
1,2 
... 
... 
9,9 

так что теперь вы должны быть в состоянии понять, что select 2000+(t*10+u) будет генерировать

2000 
2001 
2002 
... 
2099 

Предложение WHERE только ограничивает лет для тех, кто из minYear в maxYear

6

Они просто генерируют список лет от @minYear до @maxYear. Учитывая «десятки цифр» t и «одну цифру» u, вы можете получить год с 2000 + 10 * t + u. Таким образом, в течение 2016 года десятки будут равны 1, а единицы - 6.

+1

ваш ответ был правильным, как хорошо, но я выбрал другой один, так как он сломал вещи. Дал вам за участие за помощь. : D – dcp3450

Смежные вопросы