2011-06-11 34 views
1

我試圖找出這個SQL查詢如何產生一個數字序列,我仍然沒有線索。SQL交叉連接產生數字序列

數字表

digit 
-------- 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 


SELECT D3.digit * 100 + D2.digit * 10 + D1.digit + 1 AS n 
FROM dbo.Digits as D1 
CROSS JOIN dbo.Digits as D2 
CROSS JOIN dbo.Digits AS D3 
ORDERY BY n; 

查詢結果...

n 
------ 
1 
2 
3 
4 
5 
... 
998 
999 
1000 

它是如何工作的?

回答

1

CROSS JOIN很像一個INNER JOIN MYTable on 1 = 1,導致您輸入的笛卡爾乘積設置

基本上,左側的每個記錄,它加入了右側的每個記錄。

對於10位數的源表,第一個交叉連接會產生100條記錄。

在第二次交叉連接到同一個10位源表的情況下,對於源表中的每條記錄再次獲得全部100條以前的記錄,從而產生1000條記錄。

你生成的表是這樣的,如果你的SELECT語句是「選擇* ...」整理...

D1 D2 D3 
1  2  3 
1  2  4 
1  2  5 

如果你把這些值在上表中,並連接它們(然後添加一個),你會得到連續的數字。

"1" + "2" + "3" = 123 (+1 = 124) 
"1" + "2" + "4" = 124 (+1 = 125) 
"1" + "2" + "5" = 125 (+1 = 126) 

顯然,作者是不是串聯。但是,他正在做數學等值。

1 * 100 + 2 * 10 + 3 * 1 + 1 = 124 
1 * 100 + 2 * 10 + 4 * 1 + 1 = 125 
1 * 100 + 2 * 10 + 5 * 1 + 1 = 126 

最終,作者設計了一種奇怪的方式,以提供數字的列表從1到1000

2

A cross join是一個Cartesian product:也就是說,每一行都與每隔一行連接。

因此,一個11行的表加入到7行的表給出了77行

你的情況,你有10行×10列* 10行= 1000

嘗試此查詢看到原始的你約會產生數

SELECT D3.digit, D2.digit, D1.digit 
FROM dbo.Digits as D1 
CROSS JOIN dbo.Digits as D2 
CROSS JOIN dbo.Digits AS D3 
ORDER BY d3, d2, d1; 

你的路才100*d3 + 10*d2 + d1複製我們如何自然數,此外攜帶。

+0

是的,我明白,但它是如何產生的實際數字? 1,2,3,4,5等 – Kira 2011-06-11 18:38:43

1

從D3表數字的值的範圍從0 - 900(D3.digit * 100)

D2表中數字的值範圍爲0-90(D2。位* 10)

從D1表數字的值的範圍從0 - 9(D1.digit * 100)

添加起來並從0有一個範圍 - 999

添加1的結果,你有範圍從1 - 1000

2

如果你到CTE,這會給你1到1000


; 
with 
Num(Pos) as 
(
    select cast(1 as int) 
    union all 
    select cast(Pos + 1 as int) from Num where Pos < 1000 
) 
select * from Num option (maxrecursion 0)