我有一张只有一列由5种颜色组成的表 -
colour
-------
red
black
white
green
orange
我希望获得所有组合,例如
(红,橙) (黑,白) 。 。 。 等等除了相同的那些。我试图与自己交叉加入桌子。
select *
from table1 cross join table1
但我没有得到所需的答案。它返回了所有的组合。也是相同的那些。我能得到它吗?有没有其他方法可以做到这一点而不创建另一个表???
答案 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
重要的是在执行交叉连接后拒绝您不想要的元素。
请注意,这不会创建任何新表或修改现有表。 a
和b
只是同一个表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