使用CROSS JOIN

时间:2016-06-11 09:13:03

标签: sql sql-server

我正在学习如何使用CROSS JOINS,但我无法看到我正在尝试的那个错误。

我拥有的是PatternNumbers表格。

数字表:
Numberid TinyINT

模式表:
PatternID TinyINT IDentity(1,1)
Patternresult varchar(5)

我已经在{ - 1}}表格中插入了1到22行的每一行。

目前我没有显示任何结果。但是我想要显示的是所有模式之间只有数字0 - 5(我不能包括' 0'在数字表中,因为稍后我将使用一个表格,从' 1'中的数字'表开始的数字

Number

我对CROSS JOIN做错了什么?

e.g

0 - 0
0 - 1
0 - 2
0 - 3
0 - 4
0 - 5
1 - 0
1 - 1
1 - 2
1 - 3
1 - 4
1 - 5

etc

3 个答案:

答案 0 :(得分:0)

在这里你去了。我添加了"> 0"在我的查询中,因为我从0开始有数字表,你可以忽略它..

    ;With Cte
    as
    (
    select 0 as n
    union all
    select top 5 Number from numbers where number>0
    order by number
    )
Insert into dbo.pattern
(
PatternResult
)
    select cast(c.n as varchar)+'-'+b.n
     from cte c
    cross join
    (select cast(n as varchar) from cte) b(n)
    order by c.n

输出

0-0
0-1
0-2
0-3
0-4
0-5
1-0 and so on

答案 1 :(得分:0)

您的问题您的号码包含1到22之间的数字,而PatternResult只包含varchar(5)

所以当你连接一个2位数时,你会得到像'12 - 13'这样的PatternResult,其长度超过了5

因此,您的查询应该会出现截断错误,因此Pattern表中没有结果。

将PatternResult更改为varchar(10),它应该可以工作。

答案 2 :(得分:0)

首先,您的查询是insertInsert语句不返回结果集。

所以,问题是,这会带来什么回报?

select *
from dbo.Pattern

接下来,该模式可以容纳五个字符,但您已经使用了' - '三个字符。所以,尝试制作它以使图案适合(通过删除空格):

INSERT INTO dbo.Pattern(PatternResult)
    SELECT cast(n.NumberID AS VARCHAR (5)) + '-' + cast(nn.NumberID AS VARCHAR (5)) AS PatternResult
    FROM dbo.Number n CROSS JOIN
         dbo.Number nn;

最后,当使用VARCHAR()时,确保尺寸太小没有任何优势。您也可以将该字段定义为类似Patternresult varchar(255)的字段,因此它对于任何结果总是足够大。使用CHAR()时,一个小值很重要,因为所有额外的字符都存储为空格。