生成 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
这将生成所有可能的姓名组合,唯一的限制是我们不会将同一个姓名成对报告两次。
交叉连接会给你想要的东西。
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
我有 一个 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
这将生成所有可能的姓名组合,唯一的限制是我们不会将同一个姓名成对报告两次。
交叉连接会给你想要的东西。
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