SQLで同テーブルの文字列連結についての質問

このQ&Aのポイント
  • SQLで同テーブルの文字列連結を実現したいです。親テーブルと子テーブルの関係は1対1であり、子テーブルのカラムBを親テーブルのカラムAに連結して出力したいです。
  • 親テーブルと子テーブルがあり、親テーブルのカラムAと子テーブルのカラムBを連結して出力するSQLを教えてください。
  • Oracle10Gを使用しており、親テーブルと子テーブルがあります。親テーブルのカラムAと子テーブルのカラムBを連結した結果を出力するSQLを教えてください。
回答を見る
  • ベストアンサー

SQL 同テーブル、同フィールドの文字列連結

以下の様にSQLで実現したいと思っております。 なお、DBはOracle10Gを利用しております。 親と子テーブルがあり以下の構成となっております。 ■親テーブル  ID,カラムA  1 ,AA  2 ,BB  3 ,CC ■子テーブル  ID,枝番,カラムB  1 ,1 ,あああ  1 ,2 ,いいい  2 ,1 ,ううう  2 ,2 ,えええ  2 ,3 ,おおお  3 ,2 ,かかか ※IDカラムは親テーブルと子テーブルは1:1です  子テーブルの枝番カラムはIDに対してN件です。 やりたい事としては、上記の2テーブルより、以下の結果を出力したいです。  ID,カラムA,カラムB  1 ,AA ,あああ いいい  2 ,BB ,ううう えええ おおお  3 ,CC ,かかか 親テーブルを元にして、 親テーブルに紐づく子テーブルのカラムBを連結して出力 するSQLをご教授いただけますでしょうか

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

  • ベストアンサー
回答No.2

model句の出番ですな。 SELECT 親テーブル.ID, 親テーブル.カラムA, ConcatT.カラムB FROM 親テーブル LEFT OUTER JOIN ( SELECT ID, SUBSTR(ConcatカラムB, 2) AS カラムB FROM 子テーブル MODEL RETURN UPDATED ROWS PARTITION BY(ID) DIMENSION BY(Row_Number() OVER(PARTITION BY ID ORDER BY 枝番)) MEASURES(カラムB, CAST(NULL AS VARCHAR2(2)) AS ConcatカラムB) RULES ITERATE(100) UNTIL (PRESENTV(カラムB[ITERATION_NUMBER + 2], 1, 0) = 0) (ConcatカラムB[0] = ConcatカラムB[0] || ' ' || カラムB[ITERATION_NUMBER + 1]) ) ConcatT ON 親テーブル.ID=ConcatT.ID ORDER BY 親テーブル.ID; 枝番100件までの想定だけど、事前に件数数えて動的にループ数変えてもいいかも。

参考URL:
http://www.geocities.jp/oraclesqlpuzzle/model-22.html
take_PP
質問者

お礼

ご回答ありがとうございます。 芸術的で非常に参考になります。恐れいりました。 また参考URLもありがとうございます。 私も頼ってばかりでは無く勉強します、、

その他の回答 (1)

回答No.1

知っている限り、不可能です。 Nが有限であれば以下のような方法もとれなくはないですが・・・。 Select ID, カラムA, ( Select カラムB From 子 Where 子.ID=親.ID And 枝番=1 )||( Select カラムB From 子 Where 子.ID=親.ID And 枝番=2 )||( Select カラムB From 子 Where 子.ID=親.ID And 枝番=3 )||…||( Select カラムB From 子 Where 子.ID=親.ID And 枝番=N ) From 親;

take_PP
質問者

お礼

早速のご回答ありがとうございます。 やはり1つのSQLでは無理なのでしょうか、、 Nは最大値も決まっておらず無限の設計になっています、、 でもご回答頂きました内容も考慮しもう少し悩んでみます ありがとうございます。

関連するQ&A

  • access2010  同一idを列に追加

    access2010についてselectの方法を教えてください。 ↓元テーブル id | name 1 | a 1 | b 2 | aa 2 | bb 2 | cc 取得したい内容 id| name1| name2| | name3 1| a | b| 2| aa | bb | cc アクセスとエクセルのマクロを駆使していますが、うまくできません。

  • Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパ

    Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパフォーマンス向上 Oracleで1つのSQL内で同じテーブルを2回以上結合すると結果出力にかかる時間が非常に遅くなります。 例: SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id (テーブルBを2回結合している) こういう場合にパフォーマンスを落とさない方法はありますか?テンポラリテーブルでテーブルBのレプリカを作成して使用するというのはなしです。あくまで1つのSQLで結果出力できることを前提にパフォーマンスを向上する方法を教えてください。

  • SQLで同じフィールドを2つ取りだしたい

    以下のテーブルからCSVを出力する際、 ID | 名称 | コード1 | コード2 1 |  A  |  111  |  444 2 |  B  |  222  |  555 3 |  C  |  333  |  666 「ID/名称/コード1コード2」のように取りだす場合のSQL文は SELECT ID, 名称, コード1 || コード1 FROM テーブル名 となると思いますがこれを、「ID/名称コード1/名称コード2」のように同じフィールドを同じ行に2回登場させたい場合はどうすれば宜しいでしょうか。 SELECT ID, 名称 || コード1, 名称 || コード2 FROM テーブル名 とした場合にはエラーになってしまいます。 宜しくお願い致します。

  • 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にしたらよいか、よろしくお願いします。

  • group byを使う時に条件をつけたいです。

    どう頑張っても思いどうりにDBからデータがとれず困ってます... 例えばこんなテーブルがあったら(テーブル名が"test"、カラムが"name"と"id") table test name | id ---------- aa | 1 aa | 1 aa | 1 bb | 1 bb | 1 aa | 0 aa | 0 cc | 0 カラム"id"が0の時は、カラム"name"のgroup byせず カラム"id"が1の時だけ、カラム"name"のgroup byするには、どうすればいいのでしょう? このような感じにデータを取り出したいのです。 name | id  | COUNT ---------- aa | 1 | 3 bb | 1 | 2 aa | 0 | 1 aa | 0 | 1 cc | 0 | 1 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL:複数行のデータを一つの文字列にまとめたい

    複数行のデータを一つの文字列にまとめる方法を教えてください。 ※環境SQLServer2005 例: ID DATA AA XXX BB YYY AA ZZZ 次のようなテーブルがあるとき、IDがAAであるものを一つの文字列 "XXXZZZ" にまとめたデータにSQLで加工したいです。

  • ASPによるSQL構文で2つのデータベースを連結

    下記のように2つのデータベースを連結させたいのですが うまくいきません。 仕事で緊急なのでわかる方教えてください。 データベースはACCESSです。 テーブル1 A | B(日付) ---|---------- aa |2004/01/01 bb |2004/02/02 テーブル2 C | D(日付) ---|---------- cc |2004/03/03 dd |2004/04/04 ee |2004/05/05 結果 A | BD(日付) | C ---|----------|---- aa |2004/01/01| bb |2004/02/02|   |2004/03/03| cc   |2004/04/04| dd   |2004/05/05| ee strSQL="SELECT A,B,null FROM テーブル1 union all SELECT null,D,C FROM テーブル2" Set RgRs = cnn.Execute(strSQL) 上記の記述で結合させても、うまくいきませんでした。 宜しくお願いします。

  • SQLで条件の文字列を含んでいるデータを取得する方法

    SQLにて指定した文字列を含むデータを取得する方法を探しています。 例 テーブル Test 番号   条件 __________ 01    AA 02    BB 03    AA,CC 上記のように、番号と条件という2つのフィールドを持っているテーブルをTestとします。 (1)条件にAAと指定すると、番号01と03が取得。 (2)条件にBBと指定すると、番号02が取得。 (3)条件にAAAと指定すると、一致条件なし。 (1)~(3)のような条件を満たすSQLの構文はありませんでしょうか? ご教授お願いいたします。

  • 連番の最終番号から、符番しレコード作成

    いつもお世話になっています。 PL/SQL、ORACLE9.i環境にて、以下の処理を実現するSQL文を教えて頂けないでしょうか。 ※目標は、1つのSQL文で何とかしたいと思っています。 どうかよろしくお願いいたします。 【例】 TBLAにTBLBの内容を追加します。 その時、同一IDのレコードの場合、各ID毎のSEQの最終番号を洗い出し、 最終番号+1づつ設定します。 Key:ID・SEQ TBLA ID │SEQ │DATA ──┼──┼───── 0001│001 │AA1 0001│002 │AA2 0001│003 │AA3 0002│001 │BB1 0002│005 │BB2 ※削除処理の関係上、このようにSEQは歯抜けになっている場合もあります 0003│003 │CC1 TBLB YMD │ ID │DATA ──┼──┼───── 1201│0001│AA5 1201│0001│AA6 1201│0001│AA7 1201│0003│CC1 1201│0004│DD1 1201│0004│DD2 【結果】 TBLA ID │SEQ │DATA ──┼──┼───── 0001│001 │AA1 0001│002 │AA2 0001│003 │AA3 0001│004 │AA5 0001│005 │AA6 0001│006 │AA7 0002│001 │BB1 0002│005 │BB2 0003│003 │CC1 0003│004 │CC1 0004│001 │DD1 0004│002 │DD2

  • SQLで二つのテーブルを統合したい

    お世話になります。 Access2000のSQLで質問させて下さい。 下記のAとBのテーブルがある状態で、二つを統合した Cを生成したいのですが、どのようにSQLを作成したらよいでしょうか? お手数でもうしわけございませんが、SQL文で回答頂ければ助かります。 --テーブルA--- ID 名前 11 やまだ 12 さかもと --テーブルB--- ID 名前 25 きのした 26 つちや --C-- ID 名前 11 やまだ 12 さかもと 25 きのした 26 つちや