无法破译SQL语句

时间:2016-04-28 19:24:04

标签: mysql 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...让我感到困惑。

2 个答案:

答案 0 :(得分:6)

他们只是生成从@minYear@maxYear的年份列表。给出一个&#34;十位数&#34; t和a&#34;的数字&#34;你可以获得2000 + 10 * t + u的年份。因此,对于2016年,10将是1,其中1将是6。

答案 1 :(得分:3)

这只是生成序列号表的众多技巧之一。在这种情况下,从minYear到maxYear,只要它们超过2000年。

请参阅http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1

部分:生成1,000个数字的序列

如果您考虑以下

,可能更容易理解
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条款将年限限制为从minYearmaxYear

的年份