我的老师问了一个找到所有组合的算法。我有一组数据,长度是可变的。所以组合应该是这样的:
a
b
c
aa
ab
ac
...
ccbc
ccca
cccb
cccc
它们将存储在包含单个 varchar 字段的“word”表中。 我是用循环做的,因为我不喜欢递归,而且 jt 有更好的性能:
DROP PROCEDURE combi;
CREATE PROCEDURE combi
AS
BEGIN
DELETE FROM word
DECLARE @i BIGINT
DECLARE @j INT
DECLARE @word NVARCHAR(24)
DECLARE @str NVARCHAR(62)
DECLARE @combinations BIGINT
DECLARE @currentlength TINYINT
DECLARE @maxcurrentlength TINYINT
SET @maxcurrentlength=4
SET @str='azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789' -- length=62
SET @currentlength=1
-- loop on the length of the text
WHILE @currentlength<=@maxcurrentlength BEGIN
SET @combinations=POWER(62,@currentlength)
SET @i=0
-- get all combinations
WHILE i<@combinations BEGIN
SET @word=''
SET @j=0
-- generate word
WHILE @j<@currentlength BEGIN
SET @word=@word+SUBSTRING(@str, (FLOOR(@i / POWER(62,@currentlength-@j-1) ) % 62) +1, 1)
SET @j=@j+1
END
INSERT INTO word VALUES (@word)
SET @i=@i+1
END
SET @currentlength=@currentlength+1
END
END;
EXEC combi;
问题是当我使用 8 的长度时,我的服务器崩溃了:似乎 POWER(62,@currentlength-@j-1)
是问题所在。
最佳答案
我有点不明白你是怎么问这个问题的。您要求“查找所有组合”,这可以通过 CROSS JOIN 轻松完成。如果您需要获得 4 的长度,那么您将具有可用值的表连接到自身 4 次,您就完成了。如果您需要获取 1 个字段中的字符串,您可以在选择中连接它们。像这样:
declare @values table (
value nvarchar(100))
insert @values values ('a'),('b'),('c')
select v1.value+v2.value+v3.value+v4.value
from @values v1 cross join
@values v2 cross join
@values v3 cross join
@values v4
order by v1.value+v2.value+v3.value+v4.value
关于sql - 查找所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25697537/