sql - 查找所有组合

标签 sql sql-server algorithm tsql stored-procedures

我的老师问了一个找到所有组合的算法。我有一组数据,长度是可变的。所以组合应该是这样的:

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/

相关文章:

sql-server - 更改 Linux 上的默认 SQL Server 时区?

sql - 在 SQL Server 中计算运行总计

java - 查找字符串是否包含没有 Java.substring 的子字符串

algorithm - 理想的跳过列表? O(n) 运行时间?

mysql - 在同一列上连接同一个表两次,不同的值仅返回最近的行

sql - 如何将 group-by T-SQL 语句中的所有负数清零

sql - 在字符串末尾用数字排序

mysql 查询每行的另一个表的 max()

sql - 选择具有特定值的重复行

algorithm - VIM 自动完成的工作原理