SQLでtable1とtable2を結合してcode、name、itemを表示する方法

このQ&Aのポイント
  • SQL(oracle9i使用)でtable1とtable2を結合して、code、name、itemを表示する方法について教えてください。
  • table1とtable2を結合し、code、name、itemをまとめて表示するためのSQL文を教えてください。
  • table1とtable2を使用して、code、name、itemを結合して表示する方法について教えてください。
回答を見る
  • ベストアンサー

文字列の結合方法(SQL)

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

質問者が選んだベストアンサー

  • ベストアンサー
  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

貴方の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.cgi?communityid=otn-489965&bbsid=1&no=72248&view=9
lycheee
質問者

補足

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

その他の回答 (1)

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.2

こちらの方が、判りやすいかもしれませんね。 http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?COMMUNITYID=otn-901234&BBSID=1&NO=3418&VIEW=9 <<私は、上記サイトの発言者ではありませんが、よく利用させていただいております。Oracleのことなら、こちらで聞いてみてはいかがですか?>>

lycheee
質問者

補足

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

関連するQ&A

  • 結合SQLに関して

    結合SQLに関して ある3つのテーブルが存在し、TABLE1の情報を核として、TABLE2,TABLE3と 結合させて情報を取得しようと考えています。 TABLE1とTABLE2だけであれば LEFT OUTER JOIN等を駆使すれば、TABLE1を核として 全件表示可能かと思いますが、TABLE3も含めて結果のような形にしたい場合は、 どのようにSQLを記述すれば良いでしょうか。。。。 初歩的な質問で申し訳ありませんが、教えて下さい。 TABLE1 NO 1 2 3 TABLE2 NO,BUSYO_CODE 1,123 2,123 3,456 TABLE3 BUSYO_CODE,BUSYO_NAME 123,総務 456,経理 結果 NO,BUSYO_CODE,BUSYO_NAME 1,123,総務 2,123,総務 3,456,経理 よろしくお願いします。

  • SQLでテーブルを結合した結果を取り出し

    SQLで以下の様なテーブルがあります。 tableA、tableB、tableCを使って、IDとNUMとRANKを結合し、 ID毎に、 RANKが1つでもあったら、”○”でその数を RANKが1つもなかったら、”×”で0を 取り出したい。 「oracle10g」です。 -- tableA ID,NUM,NAME,・・・・・ 000001,001, 000001,002, 000001,003, 000002,001, 000003,001, 000003,002, -- tableB ID,NUM,RANK 000001,001,A 000001,001,B 000001,001,C 000001,002,A 000001,003,C 000002,001,B 000002,002,B 000003,001,A 000003,002,A 000003,002,C --tableC RANK,NAME A, B, C, 結果として、 ID,RANK,判定,個数 000001,A,○,2 000001,B,○,1 000001,C,○,2 000002,A,×,0 000002,B,○,2 000003,A,○,2 000003,B,×,0 000003,C,○,1 を得たいです。 どのようなSQLにしたらよいか、よろしくお願いします。

  • SQLを教えて下さい

    SQL文を教えて下さい 以下の2つのテーブルがあります。 TABLE1 --------------- ID,NAME,PRICE --------------- 1,部品A,100 2,部品B,200 3,部品C,300 TABLE2 --------------- ID,NAME,PRICE --------------- 1,部品Aのサブ1,1 1,部品Aのサブ2,2 2,部品Bのサブ1,5 2,部品Bのサブ2,5 --------------- SELECT TABLE1.NAME TABLE2.NAME TABLE1.PRICE TABLE2.PRICE WHERE TABLE1.ID = TABLE2.ID(+) TABLE2.PRICE = (SELECT MAX(?) ?) 期待する結果 ・TABLE1.NAME = 部品Aの場合 --------------- 部品A,部品Aのサブ2,100,2 ・TABLE1.NAME = 部品Bの場合 --------------- 部品B,部品Bのサブ1,200,5 TABLE1.NAME = 部品Cの場合 --------------- 部品C,,300, ・TABLE1のNAMEに、TABLE2のNAMEが関連付く(付かないものもある) ・外部結合とMAX関数を用いたい。 ・TABLE2のPRICEが大きい方を取得(同一の場合は、どちらかを取得)

  • 文字列の動的な結合

    C♯、.net frameworkdは2.0の環境です。 メソッドでSQL用の文字列を作っています。 引数によって、JOINするテーブルを変えたいのですが、StringBuilderではなく、 単なるStringの変数を、ひたすら + で結合している状態なので、悩んでいます。 String sql; sql = " select " + " tbl.column1 " + " from " + … こんな感じです。 StringBuilderで作り直したいのですが、諸事情により難しいので、+での文字列結合をしつつ、 ところどころ、引数を見て文字列を結合したりしなかったり…ということをスムーズにできる 方法はないでしょうか?

  • SQLで後方の文字列を置換する方法

    表現方法が稚拙で申しわけありませんが。 あるテーブルに存在する値を、他のテーブルにある値と前方一致で結合したいと思います。 (1)TBL_A(項目名はA) (a) 10230 (b) 11350 (c) 30040 (2)TBL_B(項目名はB) (d) 10200 (e) 11000 (f) 30000 (形式はVARCHAR2,値は数字のみで長さは固定) 上記のようなデータで、TBL_Bに関しては後ろの「0」は無視して 前方一致で結合したいのです。 つまり、(a)と(d)、(b)と(e)、(c)と(f)が結合されるようにしたいのです。 SQL文で表現すると、次のようになります。 TBL_A.A LIKE '102%' OR TBL_A.A LIKE '11%' OR TBL_A.A LIKE '3%' これを次のようなSQLで記述してみました。 TBL_A.A LIKE SUBSTR(TBL_B.B,1,INSTR(TRANSLATE(TBL_B.B,'123456789','XXXXXXXX'),'X',-1,1)) || '%' 以上のSQLで問題ないと思いますが、もっとシンプルな方法があればお教え願います。 DBはORACLE9iです。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • SQLの結合条件について

    SQLの結合条件について ・table_A ID | ATAI 01 | AAA 01 | XXX 02 | ABC 03 | DEF table_B ID | ATAI 01 | 不要 02 | 必要 03 | 必要 04 | 不要 上記のようなテーブルAとBがあるとします。 やりたいこと 1.テーブルAに存在するIDをBのIDから抽出 2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 ※テーブルAの01IDに’AAA’と’XXX’がありますが、Bの抽出対象から外したい。 2.がうまくいきません。 select B.ID from table_A A,table_B B where A.ID = B.ID 上記のSQLに2.の条件を足して、結果を02と03にしたいです。 ※CASEは使わずにお願いします。

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • SQL HAVING句の使い方について

    以下のテーブルAとテーブルBを結合して結果テーブルを出力したいと考えています。 (テーブルA上のIDのカウントした数をテーブルBに結合して出力したい。) テーブルA ----------- CATE ID aaa 001 bbb 001 ccc 003 ddd 004 テーブルB ----------- ID NAME 001 101 002 102 003 103 004 104 結果テーブル ---------------------- ID NAME COUNT 001 101 2 002 102 0 003 103 1 004 104 1 そこで、 =================================== SELECT B.ID, B.NAME, COUNT(A.ID) FROM TABLE_A B, TABLE_B B GROUP BY B.ID, B.NAME, A.ID HAVING A.ID = B.ID =================================== とSQLを書いてみましたが、 002 102 0 のテーブルAにIDが存在していない列が結果として表示されませんでした。 WHERE句でいう「WHERE A.ID =* B.ID」のようなことを行いたいのですが、どのように行えばよいでしょうか? よろしくお願いいたします。

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

専門家に質問してみよう