我正在学习如何使用CROSS JOINS,但我无法看到我正在尝试的那个错误。
我拥有的是Pattern
和Numbers
表格。
数字表:
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
答案 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)
首先,您的查询是insert
。 Insert
语句不返回结果集。
所以,问题是,这会带来什么回报?
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()
时,一个小值很重要,因为所有额外的字符都存储为空格。