電子書籍の厳選無料作品が豊富!

SQLで取得可能でしょうか

今2つのテーブルがあるとします。
----------------------
テーブル1
 KEY    項目
  1   テスト1
  2   テスト2
  3   テスト3
-----------------------
----------------------
テーブル2
  CD  名称 
  1   か
  1   き
  2   さ
  2   し
  2   す
  3   た
-----------------------

テーブル1のKEYはキーで重複しません。
テーブル2のCDは重複しますが、内容はテーブル1のKEYとリンクします。

今、テーブル1のKEY1件につき、データを1件取得したいのですが、
テーブル2の名称も取得したいです。
データは1件しか取得しない為、名称は、特定文字(例として/)で
区切って取得したいです。

期待したい結果
----------------------
 KEY  名称
  1  か/き
  2  さ/し/す
  3  た
----------------------

このような取得は可能でしょうか?
尚、SQLの発行は1回のみで行いたいです。

よろしくお願いします。

A 回答 (2件)

oracleのバージョンが書いていないので使えるか分かりませんが。


階層問合せを無理やり使ってみました。

with t1 as (
select 1 key,'テスト1' 項目 from dual
union all select 2,'テスト2' from dual
union all select 3,'テスト3' from dual
)
,t2 as (
select 1 CD, 'か' 名称 from dual
union all select 1,'き' from dual
union all select 2,'さ' from dual
union all select 2,'し' from dual
union all select 2,'す' from dual
union all select 3,'た' from dual
)
select
 t1.key, t2.名称
from
 t1
 inner join
 (select
  cd, substr(名称,2) 名称, lev,
  --最下層を取得するためのCD毎の最大のLEVEL
  max(lev) over(partition by CD) max_level
 from
  (select
   cd, sys_connect_by_path(名称,'/') 名称, level lev
  from
   (select
    t2.*,
    --階層問合せをするためにコード毎に順序付け
    row_number() over(partition by CD order by 名称) recnum from t2)
  start with recnum = 1
  connect by prior cd = cd
      and prior recnum = recnum - 1)) t2
 on t1.key = t2.cd
 and t2.lev = t2.max_level;

oracle10.2.0.1.0では期待結果が取得できました。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。
取得を確認できました。
ご回答どうもありがとうございました。

お礼日時:2010/09/02 22:02

#手元で実験できないのでてきとーなことを言っているかもしれないので参考程度に。



CONNECT BY と SYS_CONNECT_BY_PATH() を組み合わせればちょこちょこっとできませんかね?
KEYの値が同一だから階層に出来ないかなー?

oracleのSQLリファレンスあたりでCONNECT BY のサンプルに
そんなサンプルがあった気がします。
    • good
    • 0
この回答へのお礼

色々試してみて、取得を確認できました。
ご回答、どうもありがとうございます。

お礼日時:2010/09/02 22:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!