开发者

TSQL Set theory [closed]

开发者 https://www.devze.com 2023-01-16 11:48 出处:网络
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical andcannot be reasonably answered in its current form. For help clari
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center. Closed 12 years ago.

Here is the question

You are to label the dice sides with numbers. Each dice has 6 sides. You have two dice. You must label so that you can display (not sum or product) the numbers 0 to 31. Complete output:

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

I tried

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

    join开发者_StackOverflow中文版

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

I don't know how to process it further.Help is appreciated.


As Martin mentioned in his comment, the key to solving this problem is to use the upside down 6 for a 9. See: solution: calendar cubes

As for a programmatic T-SQL solution, perhaps:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号