我认为自己在编写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...
让我感到困惑。
答案 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
条款将年限限制为从minYear
到maxYear