-2

2 つの列 (どちらもプライマリ) [PLAYER_ID] [LEAUGE_ID] があります。

このようなもの:

Player_id      League_id
2139            8
2153            8
2302            10
2441            8
2441            10  

両方のリーグでプレーした同じ選手を探しています

上の表によると、次のものだけを見つけようとしています。

Player_id     League_id_1     League_id_2
2441          8               10

前もって感謝します!

4

3 に答える 3

9

1行目にこれが必要なようです。したがって、以下を使用して、PIVOT:を使用して1行にまとめることができます。

select player_id,
  league_id_1,
  league_id_2
from
(
  select t1.player_id, t1.league_id,
    row_number() over(partition by t1.player_id order by t1.league_id) rn
  from table1 t1
  inner join
  (
    select player_id
    from table1
    group by player_id
    having count(distinct league_id) > 1
  ) t2
    on t1.player_id = t2.player_id
) x
pivot
(
  max(league_id)
  for rn in (1 as league_id_1, 2 as league_id_2)
) p;

SQL FiddlewithDemoを参照してください

PIVOTまたは、関数にアクセスできない場合はCASE、aggregateでステートメントを使用できます。

select player_id,
  max(case when rn = 1 then league_id end) league_id_1,
  max(case when rn = 2 then league_id end) league_id_2
from
(
  select t1.player_id, t1.league_id,
    row_number() over(partition by t1.player_id order by t1.league_id) rn
  from table1 t1
  inner join
  (
    select player_id
    from table1
    group by player_id
    having count(distinct league_id) > 1
  ) t2
    on t1.player_id = t2.player_id
) x
group by player_id;

SQL FiddlewithDemoを参照してください

1行に入れたくない場合は、内部サブクエリを使用できます。

  select t1.player_id, t1.league_id
  from table1 t1
  inner join
  (
    select player_id
    from table1
    group by player_id
    having count(distinct league_id) > 1
  ) t2
    on t1.player_id = t2.player_id

SQL FiddlewithDemoを参照してください

于 2012-10-17T16:23:45.433 に答える
1

行に入れてもかまわない場合:

SELECT t.*
FROM myTable t
INNER JOIN
(
    SELECT Player_id
    FROM myTable
    GROUP BY Player_id
    HAVING COUNT(*) = (SELECT COUNT(DISTINCT(League_id)) FROM myTable)
) p ON t.Player_id = p.Player_id

これは戻るはずです:

Player_id League_id
2441 8
2441 10

SQLフィドル

于 2012-10-17T16:15:36.690 に答える
0

PIVOT(11gのみ)を使用できず、すべてのLeague_idを1行で出力する場合は、次のことを試してください。

            DECLARE
               v_owner VARCHAR2 ( 40 );
               v_player_id VARCHAR2 ( 40 );
               v_league_id VARCHAR2 ( 100 );
               v_league_id_total VARCHAR2 ( 1000 );

               /* First cursor */
               CURSOR get_player_id
               IS
                  SELECT DISTINCT player_id
                  FROM            table1
                  ORDER BY        player_id;

               /* Second cursor */
               CURSOR get_league_id
               IS
                  SELECT   league_id
                  FROM     table1
                  WHERE    player_id = v_player_id
                  ORDER BY league_id;
            BEGIN
               -- Open first cursor
               OPEN get_player_id;

               LOOP
                  FETCH get_player_id
                  INTO  v_player_id;

                  v_league_id_total := '';
                  EXIT WHEN get_player_id%NOTFOUND;

                  -- Open 2nd cursor
                  OPEN get_league_id;

                  LOOP
                     FETCH get_league_id
                     INTO  v_league_id;

                     EXIT WHEN get_league_id%NOTFOUND;
                     v_league_id_total := v_league_id_total || ' , ' || v_league_id;
                  END LOOP;

                  DBMS_OUTPUT.put_line ( RPAD ( v_player_id,
                                                26,
                                                ' '
                                              ) ||
                                         RPAD ( v_league_id_total,
                                                26,
                                                ' '
                                              ) );

                  CLOSE get_league_id;
               END LOOP;

               CLOSE get_player_id;
            EXCEPTION
               WHEN OTHERS
               THEN
                  raise_application_error ( -20001,
                                            'An error was encountered - ' ||
                                            SQLCODE ||
                                            ' -ERROR- ' ||
                                            SQLERRM );
            END;

出力は次のようになります:

2139     , 8                      
2153     , 8                      
2303     , 8 , 10   (I added one more record.)              
2441     , 8 , 10 , 11 , 12   (I added 2 more records)    
于 2012-10-17T17:08:57.533 に答える