こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQL文 テーブルの作成方法について

以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。

元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。
(NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります)
加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。
(新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります)
----------------------------------------------------
■ TABLE1
IDNAME1NAME1_CATENAME2NAME2_CATE
----------------------------------------------------
001鈴木A山田B
002山本A
003佐藤A高橋B
----------------------------------------------------

----------------------------------------------------
■ TABLE2
IDNAMENAME_CATE
----------------------------------------------------
001鈴木A
001山田B
002山本A
003佐藤A
003高橋B
・・・
----------------------------------------------------


いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。
現状のSQL(エラーとなります)
======================================================================================
SELECT ID, NAME, NAME_CATE
FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL)
JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL)
======================================================================================

初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

投稿日時 - 2009-11-04 11:57:50

QNo.5420995

困ってます

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

UNION ALLで問題があるのですかね。こういうことかな。

SELECT id, name1 name, name1_cate name_cate FROM table1 WHERE name1 IS NOT NULL
UNION ALL
SELECT id, name2, name2_cate FROM table1 WHERE name2 IS NOT NULL
ORDER BY 1,3;

もしくは、

SELECT id, name, name_cate
FROM (
SELECT id,
CASE WHEN p = 1 THEN name1 ELSE name2 END name,
CASE WHEN p = 1 THEN name1_cate ELSE name2_cate END name_cate
FROM table1, (SELECT level p FROM dual CONNECT BY level <= 2) x
)
WHERE name IS NOT NULL
ORDER BY id, name_cate;

ORDER BYは不要でしょうから抜いてください。

投稿日時 - 2009-11-04 14:30:09

お礼

ご回答、ありがとうございます。
「UNION ALL」の方法で出来ました。

※No1の方と回答で、問題なかったと思いますが、別名の指定が良く理解できていませんでした。
(INSERT文の行をSELECTに変えて行おうとしていたダメでした)

ありがとうございました。

投稿日時 - 2009-11-04 15:08:41

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

insert into TABLE1 (ID,NAME,NAME_CATE)
select ID,NAME1,NAME1_CATE from TABLE2 where NAME1 is not null
union all
select ID,NAME2,NAME2_CATE from TABLE2 where NAME2 is not null
;
とかで良いんじゃないかな。(テストしてないけど)

投稿日時 - 2009-11-04 12:46:34

お礼

ご回答、ありがとうございます。
説明不足ですみません、
加工後はテーブルではなくビューにしたいため、SELECT文で考えています。

よろしくお願いいたします。

投稿日時 - 2009-11-04 13:49:10