排列和组合

shi*_*ndu 0 sql combinations permutation cross-join

我有一张桌子,只有一列由5种颜色组成 -

colour
-------
red
black
white
green 
orange
Run Code Online (Sandbox Code Playgroud)

我希望得到所有的组合

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

select * 
from table1 cross join table1
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*rak 5

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

SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color != b.color
Run Code Online (Sandbox Code Playgroud)

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

SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color > b.color
Run Code Online (Sandbox Code Playgroud)

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

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

你不能没有 join(然后你的行数太少),也没有别名就可以轻松做(你必须引用两列来拒绝某些行),也没有理由分配别名.