3

指定されたテーブル:

create table Person( Name varchar(100) )

Name はすべての Person に対して一意です

可能なすべての n!/((n-2)!2!) ラウンド ロビンの組み合わせを生成できる SQL クエリはどれですか?

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
4

3 に答える 3

1
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
于 2012-11-14T05:03:16.567 に答える
1

問題の2つの解決策を次に示します

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 

ここに画像の説明を入力

于 2012-11-14T03:31:03.957 に答える
0

これは 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 の追加の結合句を使用して結合する必要があります。

于 2012-11-14T03:56:33.547 に答える