2 Replies Latest reply: Jul 31, 2012 9:41 PM by user8777643 RSS

    SQL文の書き方について

    user8777643
      環境 OS Windows 2008Server
            Windows7 Sp1
      Oracle 11.2

      以下のようなテーブルがあったとします。



      Aテーブル
      CD  備考A
      10   xxxxxxxxxxx
      20   xxxxxxxxxxx
      30   xxxxxxxxxxx
      30   xxxxxxxxxxx
      30   xxxxxxxxxxx


      Bテーブル
      CD  備考B
      10   ooooooooooo
      20   ooooooooooo
      20   ooooooooooo
      30 ooooooooooo


      結果としてほしいのは


      CD     備考A            備考B
      10       xxxxxxxxxxx       ooooooooooo
      20       xxxxxxxxxxx       ooooooooooo
      20       (null)        ooooooooooo
      30       xxxxxxxxxxx        ooooooooooo
      30       xxxxxxxxxxx       (null)
      30       xxxxxxxxxxx       (null)



      といった感じで、CDをキーとして、お互いに外部結合をしたような
      結果が欲しいと思っています。


      よろしくお願いいたしますm(_ _)m

      Edited by: user8777643 on 2012/07/31 17:05
        • 1. Re: SQL文の書き方について
          yamada
          お互いに外部結合をしたような
          完全外部結合(full outer join)という方法があります。
          ただ、提示のデータではCDだけでの結合では無理ですね。
          CDごとに連番を振って、その連番も結合条件に含めればよさそうです。
          当方の環境(10g XE)で試した結果です。
          with Aテーブル as (
          select '10' CD,'xxxxxxxxxxx' 備考A from dual
          union all select '20' CD,'xxxxxxxxxxx' 備考A from dual
          union all select '30' CD,'xxxxxxxxxxx' 備考A from dual
          union all select '30' CD,'xxxxxxxxxxx' 備考A from dual
          union all select '30' CD,'xxxxxxxxxxx' 備考A from dual
          ),
          Bテーブル as (
          select '10' CD,'ooooooooooo' 備考B from dual
          union all select '20' CD,'ooooooooooo' 備考B from dual
          union all select '20' CD,'ooooooooooo' 備考B from dual
          union all select '30' CD,'ooooooooooo' 備考B from dual
          )
          select 
           nvl(a.CD,B.CD) CD
           ,備考A
           ,備考B
          from 
            (select 
              CD
              ,備考A
              ,row_number() over(partition by CD order by rownum) RNUM
            from Aテーブル) A
            full outer join 
              (select 
                CD
                ,備考B
                ,row_number() over(partition by CD order by rownum) RNUM
              from Bテーブル) B
              on (A.CD = B.CD and A.RNUM = B.RNUM)
          order by CD,備考A,備考B;
          
          --結果
          CD     備考A     備考B
          10     xxxxxxxxxxx     ooooooooooo
          20     xxxxxxxxxxx     ooooooooooo
          20     (null)     ooooooooooo
          30     xxxxxxxxxxx     ooooooooooo
          30     xxxxxxxxxxx     (null)
          30     xxxxxxxxxxx     (null)
          • 2. Re: SQL文の書き方について
            user8777643
            何とかできそうです。
            ありがとうございます!