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

テーブルが2つあるとします。
テーブルAにはテーブルBの列名がデータとして登録されてます。
テーブルBには値が格納されてます。


テーブルA
Key  field1  field2  field3
------------------------------
1   item2  item3  item5
2   item1  item2  item5
------------------------------


テーブルB
Key  item1  item2  item3  item4  item5
--------------------------------------------
1    101   205    350   420   510
2    111   112    113   114   115
--------------------------------------------


ここでテーブルAとテーブルBへキーを指定して、
テーブルAのfield1~field3に登録されたすべての列名を元にテーブルBから値を取得したいです。

例として
キー1を指定して取得すると
205,350,510 が取れます (item2,item3,item5の列名をテーブルAで指定した為)

キー2を指定して取得すると
111,112,115 が取れます


キーをパラメータとして与え、
できれば2つのテーブルを結合し、1回のSQLで取得する方法はありますでしょうか?
(1回のSQLでなくても簡易であれば良いですが)


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

A 回答 (3件)

「動的SQL」を使うのはヤダ! ってことですか?

この回答への補足

初心者ですみません。
動的SQLで列名自体を変える事も可能って事でしょうか?
たとえば、どういうイメージになりますでしょうか?

補足日時:2013/02/14 09:13
    • good
    • 0

イメージですか?



set serveroutput on
DECLARE
v_recA テーブルA%ROWTYPE;
V_sql VARCHAR2(1000);
v_ret1 NUMBER;
v_ret2 NUMBER;
v_ret3 NUMBER;
BEGIN
v_sql := 'SELECT * FROM テーブルA WHERE key = :key';
EXECUTE IMMEDIATE v_sql INTO v_recA USING 1;
v_sql := 'SELECT '||v_recA.field1||','||v_recA.field2||','||v_recA.field3||' FROM テーブルB WHERE key = :key';
EXECUTE IMMEDIATE v_sql INTO v_ret1, v_ret2, v_ret3 USING 1;
DBMS_OUTPUT.PUT_LINE(v_ret1||','||v_ret2||','||v_ret3);
END;
/

「動的SQL」について詳しいことを知りたければ「ORACLE 動的SQL」でGOOGLE先生に訊いてください。

無理をしてSQLでできないこともないと思いますが
(パズルとしては面白いかもしれませんが、時間がないので…)
「動的SQL」を使うほうが素直で無難だと思います(初心者ならなおさら)。
    • good
    • 1

え~と・・・時間ができたので(笑)SQL版をば



-- keyの設定(SQL*Plusでの実行を想定)

VARIABLE v_key NUMBER

EXECUTE :v_key := 1

-- なんか…無理矢理だな~、DB設計が悪いんだよな(笑)版

SELECT
MAX(CASE WHEN A.fno = 1 THEN B.fvalue END) AS field1,
MAX(CASE WHEN A.fno = 2 THEN B.fvalue END) AS field2,
MAX(CASE WHEN A.fno = 3 THEN B.fvalue END) AS field3
FROM
(
SELECT 1 AS fno, field1 AS fname FROM テーブルA WHERE key = :v_key
UNION ALL
SELECT 2 AS fno, field2 AS fname FROM テーブルA WHERE key = :v_key
UNION ALL
SELECT 3 AS fno, field3 AS fname FROM テーブルA WHERE key = :v_key
) A,
(
SELECT 'item1' AS fname, item1 AS fvalue FROM テーブルB WHERE key = :v_key
UNION ALL
SELECT 'item2' AS fname, item2 AS fvalue FROM テーブルB WHERE key = :v_key
UNION ALL
SELECT 'item3' AS fname, item3 AS fvalue FROM テーブルB WHERE key = :v_key
UNION ALL
SELECT 'item4' AS fname, item4 AS fvalue FROM テーブルB WHERE key = :v_key
UNION ALL
SELECT 'item5' AS fname, item5 AS fvalue FROM テーブルB WHERE key = :v_key
) B
WHERE A.fname = B.fname
/

「動的SQL」をオススメします。
    • good
    • 0
この回答へのお礼

お返事が遅くなりました。
解決しました。
どうも、ありがとうございます。

お礼日時:2013/03/06 13:03

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

関連するカテゴリからQ&Aを探す