【问题标题】:SQL All Possible Round Robin Combinations between two TablesSQL 两个表之间所有可能的循环组合
【发布时间】:2012-11-02 13:26:31
【问题描述】:

给定表:

create table Person( Name varchar(100) )

其中名称对所有人员都是唯一的

什么 SQL 查询可以生成所有可能的 n!/((n-2)!2!) 个循环组合?

假设Person的基数总是等于4

示例人物 = {'Anna','Jerome','Patrick','Michael')

输出:

Anna, Jerome
Anna, Patrick
Anna, Michael
Jerome, Patrick
Jerome, Michael
Patrick, Michael

任何帮助将不胜感激。谢谢!

这是我的答案(我使用了 oracle SQL):

select P1.NAME PERSON1, P2.NAME PERSON2
  from (select rownum RNUM, NAME
        from PERSON) P1,
       (select rownum RNUM, NAME
          from PERSON) P2
 where P1.RNUM < P2.RNUM

【问题讨论】:

  • 两个名称不相等的表实例的简单连接。但是,这会导致比正确解决方案多两倍的行,例如Anna,Michael 和 Michael,Anna(不正确)

标签: sql oracle combinations round-robin


【解决方案1】:

这里有两种解决方案

SELECT  t1.Name + ',' +  t2.Name AS NamesCombination
FROM Person t1
INNER JOIN Person t2
ON t1.Name < t2.Name

或(Oracle 11i R2+)

WITH NamesCombination AS 
( 
    SELECT  1 AS Cntr
            ,Name 
            , CAST(Name AS VARCHAR(MAX))AS NamesCombinations
    FROM Person 
    UNION ALL 
    SELECT  
        nc.Cntr+1
        ,p.Name 
        ,nc.NamesCombinations + ',' +  CAST(p.Name AS VARCHAR(MAX))                      
    FROM Person AS p JOIN NamesCombination nc ON p.Name < nc.Name
    WHERE nc.Cntr < 2  
)
SELECT NamesCombinations
FROM NamesCombination
WHERE Cntr  = 2 

【讨论】:

    【解决方案2】:
    select P1.NAME PERSON1, P2.NAME PERSON2
      from (select rownum RNUM, NAME
            from PERSON) P1,
           (select rownum RNUM, NAME
              from PERSON) P2
     where P1.RNUM < P2.RNUM
    

    【讨论】:

      【解决方案3】:

      请注意,这是 TSQL (Sql Server) 语法。我知道 Oracle 支持窗口函数,尤其是 row_number(),这是此解决方案所必需的。

      通过一些试验和错误,让它在 Oracle 中工作应该不会太难

      select p1.name, p2.name
      from 
      (
          select name,  row_number() over(order by name) as rownumber 
          from person
      ) p1
      inner join
      (
          select name, row_number() over(order by name) as rownumber
          from person
      ) p2
      on p1.name <> p2.name
      and p1.rownumber > p2.rownumber
      order by 1
      

      row_number 为每一行分配一个行号。然后,您需要按照前面的建议加入 p1.rownumber > p2.rownumber

      的附加连接子句

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 2021-06-06
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多