排列和组合

时间:2013-01-07 12:12:00

标签: sql permutation combinations cross-join

我有一张只有一列由5种颜色组成的表 -

colour
-------
red
black
white
green 
orange

我希望获得所有组合,例如

(红,橙) (黑,白) 。 。 。 等等除了相同的那些。我试图与自己交叉加入桌子。

select * 
from table1 cross join table1

但我没有得到所需的答案。它返回了所有的组合。也是相同的那些。我能得到它吗?有没有其他方法可以做到这一点而不创建另一个表???

2 个答案:

答案 0 :(得分:5)

如果相同则表示像(白色,白色)这样的对,也许这就是你想要的:

SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color != b.color

如果相同则另外意味着只保留(白色,黑色)或(黑色,白色)中的一个或许这就是你想要的:

SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color > b.color

重要的是在执行交叉连接后拒绝您不想要的元素。

请注意,这不会创建任何新表或修改现有表ab只是同一个表colors的两个不同别名。该表只有一列color,但由于该表在SELECT中存在两次,因此您需要区分colors表的两个(概念性的,非事实!)实例。

你不能没有 join(那么你的行数太少了),你也不能轻易做到没有别名(你必须引用两个列来拒绝某些行也没有理由分配别名。

答案 1 :(得分:1)

组合:

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