2010-09-15 50 views
2

這裏是問題TSQL集理論

你要用數字標記骰子邊。每個骰子有6面。你有兩個骰子。您必須標籤,這樣就可以顯示(沒有總結或產品)的數字0到31的完整輸出:

00 
01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 

我試圖

(select 
     0 as dice1 union 
     select 1 union 
     select 2 union 
     select 3 union 
     select 4 union 
     select 5) 

    join 

(select 
     0 as dice2 union 
     select 1 union 
     select 2 union 
     select 3 union 
     select 4 union 
     select 5) 

我不知道如何進一步處理它。幫助表示讚賞。

+4

不知道。你肯定會需要6,7,8,9在一個或其他的骰子。但是0,1和2需要放在兩個骰子上,只剩下7個數字的6個插槽!也許你必須把6倒過來才能得到9。無論如何,與SQL Server 2005無關! – 2010-09-15 15:11:04

+1

經常遇到的問題是由您有時在銀行看到的由木塊組成的「連續壓光機」。這個問題嚴格限制過度,正如@Martin所暗示的那樣,用6/9的模糊來解決問題。但是,無論如何,這不是一個編程問題,而是關鍵問題。 – dmckee 2010-09-15 17:22:23

回答

1

正如馬丁在他的評論中提到的,關鍵要解決這個問題是使用倒掛6一9參見:solution: calendar cubes

作爲一個綱領性的T-SQL的解決方案,或許是:

declare @Dice1 table (
    side int 
) 

insert into @Dice1 
    (side) 
    select 0 union all 
    select 1 union all 
    select 2 union all 
    select 3 union all 
    select 4 union all 
    select 5 

declare @Dice2 table (
    side int 
) 

insert into @Dice2 
    (side) 
    select 0 union all 
    select 1 union all 
    select 2 union all 
    select 6 union all 
    select 7 union all 
    select 8 union all 
    select 9 /* Upside down 6 */ 


select CAST(d1.side as CHAR(1)) + CAST(d2.side as CHAR(1)) as MyDate 
    from @Dice1 d1 
     cross join @Dice2 d2 
    where d1.side * 10 + d2.side <= 31 
union 
select CAST(d2.side as CHAR(1)) + CAST(d1.side as CHAR(1)) as MyDate 
    from @Dice1 d1 
     cross join @Dice2 d2 
    where d2.side * 10 + d1.side <= 31 
order by MyDate 
+0

非常優雅的解決方案。它是'0 1 2 3 4 5'和'0 1 2 7 8 6'。 – 2010-09-15 20:43:20

+0

爲什麼'MyDate'? :) – 2010-09-15 20:49:12

+0

@Denis:多年和幾年喝微軟庫爾援助:我的文檔,我的下載,...,MyDate。 :-) – 2010-09-15 20:55:27