生成 SQL 中所有可能的组合?

Generate all possible combinations in SQL?

我有 一个 table 成分名称:

Name
________
Cheese
Beans
Potato
etc

我想在 两个 列中显示这些值的所有可能组合,例如 (cheese, beans) (cheese, potato)、(beans, potato) 等。这可能吗?

那是 self-join:

select t1.name name1, t2.name name2
from ingredients t1
inner join ingredients t2 on t2.name > t1.name

不等式条件确保我们不会生成“镜像”记录(如“cheese/beans”与“beans/cheese”)。

如果您想要镜像记录,请将其更改为t2.name <> t1.name

如果您还想要“重复”记录(如“cheese/cheese”),请改用 cross join

使用自连接

select i1.ingredient, i2.ingredient
from ingredients i1 join
     ingredients i2
     on i1.ingredient < i2.ingredient;

对于四种成分,这将 return 6 行,所有可能的对,但每对只出现一次。

注意:这假设您不想要重复项。如果您想要 all 对,其中相同的成分可以按任意顺序出现在两列中,则使用 cross join:

select i1.ingredient, i2.ingredient
from ingredients i1 cross join
     ingredients i2;

使用交叉连接:

SELECT t1.Name, t2.Name
FROM yourTable t1
CROSS JOIN yourTable t2
WHERE t1.Name <> t2.Name;   -- use t1.Name < t2.Name if you don't want
                            -- a given pair appearing in reverse

Demo

这将生成所有可能的姓名组合,唯一的限制是我们不会将同一个姓名成对报告两次。

交叉连接会给你想要的东西。

FROM tableName t1
CROSS JOIN tableName t2;

交叉连接为您提供所有可能的组合。

可以通过多种方式实现。我会按照已经建议的那样进行交叉连接,因为我认为这看起来更清楚。 您也可以在名称不相等的地方将 table 与其自身连接起来。

declare @t table (name varchar(50))

insert into @t
values('a'),('b'),('c'), ('d'), ('e'), ('f')

select * from @t t1 join @t t2
on t1.name <> t2.name