我有一张桌子,只有一列由 5 种颜色组成-
colour
-------
red
black
white
green
orange
我想得到所有的组合,比如
(红色,橙色)(黑色,白色)。. . 等,除了相同的。我试图交叉加入表格。
select *
from table1 cross join table1
但我没有得到想要的答案。它返回了所有的组合。还有相同的组合。我怎么能得到它???有没有其他方法可以在不创建另一个表的情况下做到这一点???
我有一张桌子,只有一列由 5 种颜色组成-
colour
-------
red
black
white
green
orange
我想得到所有的组合,比如
(红色,橙色)(黑色,白色)。. . 等,除了相同的。我试图交叉加入表格。
select *
from table1 cross join table1
但我没有得到想要的答案。它返回了所有的组合。还有相同的组合。我怎么能得到它???有没有其他方法可以在不创建另一个表的情况下做到这一点???
如果相同,您的意思是像 (white, white) 这样的对,也许这就是您想要的:
SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color != b.color
如果相同,您还意味着仅保留 (white, black) 或 (black, white) 之一,也许这就是您想要的:
SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color > b.color
重要的部分是在执行交叉连接后拒绝不需要的元素。
请注意,这不会创建任何新表或修改现有表。a
并且b
只是同一张表的两个不同别名colors
。该表只有一列color
,但由于该表在 SELECT 中出现两次,因此您需要区分表的两个(概念上的,而不是事实的!)实例colors
。
你不能没有 a join
(那么你的行太少),你也不能轻松地没有别名(你必须引用两列来拒绝某些行),也没有理由分配别名。
组合:
SELECT a.color,b.color
FROM colors a
JOIN colors b
ON a.color < b.color
排列:
SELECT a.color,b.color
FROM colors a
JOIN colors b
ON a.color != b.color