【问题标题】:permutation and combination排列组合
【发布时间】:2012-12-21 04:00:42
【问题描述】:

我有一张表,只有一列包含 5 种颜色-

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

我想得到所有的组合像

(红色,橙色) (黑,白) . . . 等,除了相同的。我试图交叉加入表格。

select * 
from table1 cross join table1

但我没有得到想要的答案。它返回了所有的组合。同样的组合。我怎样才能得到它???有没有其他方法可以在不创建另一个表的情况下做到这一点???

【问题讨论】:

    标签: sql permutation combinations cross-join


    【解决方案1】:

    如果相同,您的意思是像 (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
    

    重要的部分是在执行交叉连接后拒绝不需要的元素。

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

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

    【讨论】:

    • 如果我不想使用另一个列或另一个表怎么办????有什么办法吗???? @jan dvorak
    • @shishir_bindu 您没有使用两个表。这将使用同一个表两次(ab 只是别名)。你不能不加入表本身。
    • 谢谢你。:) 我没有得到第一名的别名概念。但现在明白了。再次感谢。
    【解决方案2】:

    组合:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多