プロが教えるわが家の防犯対策術!

SQLでの文字列結合を教えてください。
(oracle9i使用)

table1とtable2があります。

(table1)
code  name  tel
-------------------
10   aoki  090-
20   kai   090-

(table2)
code  item
-----------
10   A
10   B
10   C
20   A
20   C

この2つの表を使って

code  name  item
-------------------
10  aoki   A B C
20  kai   A C

という結果にしたいのですが
どのようなSQLを組めば良いのか教えてください!

↓どうしてもこうなってしまいます・・・

code  name   item
--------------------
10   aoki    A
10    aoki     B
10   aoki     C
20   kai    A
20   kai    C

A 回答 (2件)

こちらの方が、判りやすいかもしれませんね。



http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cg …

<<私は、上記サイトの発言者ではありませんが、よく利用させていただいております。Oracleのことなら、こちらで聞いてみてはいかがですか?>>

この回答への補足

ありがとうございますっ(>_<)
参考にさせていただいておりますが、
私の知識が相当足りないようで苦戦中です・・・

補足日時:2005/10/08 21:53
    • good
    • 0

貴方のSQLの習得度はどれくらいでしょうか?


ご質問の内容ですが、プロシジャを作成するか、
以下の方法を応用するしかないようです。
-----------------------------------------
Oracle9iでのオブジェクト指向機能を利用して
同じキー項目の特定列をカンマ編集で出力。
この集計関数 list() を使って
ALL_TAB_COLUMNS から CREATE TABLE文を
SQLで生成してみます。
-- オブジェクトと関数の定義

create or replace type ListImpl as object
(
listv VARCHAR2(4000),
static function ODCIAggregateInitialize(sctx IN OUT ListImpl)
return number,
member function ODCIAggregateIterate(self IN OUT ListImpl,
value IN varchar) return number,
member function ODCIAggregateTerminate(self IN OUT ListImpl,
returnValue OUT varchar, flags IN number)
return number,
member function ODCIAggregateMerge(self IN OUT ListImpl,
ctx2 IN ListImpl) return number
);
/
show error

create or replace type body ListImpl is
static function ODCIAggregateInitialize(sctx IN OUT ListImpl)
return number is
begin
sctx := ListImpl(null);
return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT ListImpl,
value IN varchar) return number is
begin
if (self.listv is null) then
self.listv := rtrim(value);
elsif (value is not null) then
self.listv := self.listv||','||rtrim(value);
end if;
return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN OUT ListImpl,
returnValue OUT varchar, flags IN number) return number is
begin
returnValue := self.listv;
return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT ListImpl,
ctx2 IN ListImpl) return number is
begin
if (self.listv is null) then
self.listv := ctx2.listv;
elsif (ctx2.listv is not null) then
self.listv := self.listv||','||ctx2.listv;
end if;
return ODCIConst.Success;
end;
end;
/
show error

create or replace function LIST(input varchar) return varchar
parallel_enable aggregate using ListImpl;
/
show error


【実行例】
column list format a40
select deptno,list(ename) "LIST" from scott.emp
group by deptno;

DEPTNO LIST
---------- ----------------------------------------
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD


【実行例-その2】
-- interval などの型には対応していませんが
-- 簡単な(?) CREATE TABLE文を作成する例

column "CREATE TABLE" format a40 word_wrap

select 'CREATE TABLE "'||owner||'"."'||table_name||'" ('||
list(
'"'||column_name||'" '||
data_type||
case
when data_type = 'NUMBER'
then
case
when data_scale is not null
and data_precision is not null
then '('||data_precision||','||data_scale||')'
when data_precision is not null
then '('||data_precision||')'
end
when data_type like '%CHAR%'
then '('||data_length||')'
end||
case when nullable='N' then ' NOT NULL' end
)|| -- list 関数の終わり
');' as "CREATE TABLE"
from (select owner,table_name,column_name,
data_type,data_precision,data_scale,
data_length,
nullable
from all_tab_columns
where owner in ('OE','HR')
order by owner,table_name,column_id)
group by owner,table_name
;

CREATE TABLE
----------------------------------------
CREATE TABLE "HR"."JOBS" ("JOB_ID"
VARCHAR2(10) NOT NULL,"JOB_TITLE"
VARCHAR2(35) NOT NULL,"MAX_SALARY"
NUMBER(6,0),"MIN_SALARY" NUMBER(6,0));

CREATE TABLE "HR"."REGIONS"
("REGION_ID" NUMBER NOT
NULL,"REGION_NAME" VARCHAR2(25));

(以下省略)
--------------------------------------------
同様な質問が参照URLにありました。

参考URL:http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cg …

この回答への補足

( ̄ェ ̄;)結構難解そうですね・・・
私のSQL習得レベルは・・・
勉強を始めたばかりです・・・

補足日時:2005/10/08 21:56
    • good
    • 0

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