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

解決済みの質問

ある条件でのSQLの取得方法について

以下の条件でのSQLのデータの取得方法が分かりません。

2つのテーブルがあるとします。

・テーブルA
キー   項目1
10     X
20     Y

・テーブルB
キー  項目2  項目3
10     5    C
10     6    D
12     6    E

ここで取得する条件として
■テーブルAにあるのは、必ず取得します。
■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は
 別レコードとして取得します。
■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、
 複数件あるかも知れません。
 無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。
■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと
 同じレコードに、項目2が同じデータの情報を出力します。
 項目2が同じデータが無い場合はこの情報は出力しません。
 項目2が同じ値のデータは最大2件しかありません。


上記の例の場合に出力したい結果
・出力テーブルC
キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値
10  テーブルA   X
10  テーブルB         5    C
10  テーブルB         6    D        12            E
20  テーブルA   Y

(テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します)

これを出来ればSQL、出来なければPL/SQLで取得したいのですが
どちらの場合でも取得の方法に悩んでいます。
どのような方法で取得できるのでしょうか?

投稿日時 - 2011-05-01 01:29:37

QNo.6705758

困ってます

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

環境が無いので試してませんが、こんな感じかな。

SELECT A.キー, 'テーブルA' AS フラグ, A.項目1, NULL AS 項目2, NULL AS 項目3, NULL AS 同じキー, NULL AS 同じ値
FROM テーブルA AS A
UNION ALL
SELECT B.キー, 'テーブルB' AS フラグ, NULL AS 項目1, , B.項目2, B.項目3, C.キー AS 同じキー, C.項目3 AS 同じ値
FROM テーブルB AS B
LEFT JOIN テーブルB AS C ON B.項目2 = C.項目2 AND B.キー <> C.キー
ORDER BY 1, 2, 4

※テーブルBにあってテーブルAに無いものをどうするかは考慮してません。

投稿日時 - 2011-05-01 10:18:52

お礼

お礼がとっても遅くなってしまいました。すみません。
無事解決しています。

投稿日時 - 2012-04-03 08:55:43

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

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

回答(2)

ANo.2

>■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は別レコードとして取得します。
という条件からテーブルBのうち、テーブルAに存在するキーのみのレコードを取得すると思われるので、

yorozu_yaさんのSQLの一部だけ変えて、

SELECT A.キー, 'テーブルA' AS フラグ, A.項目1, NULL AS 項目2, NULL AS 項目3, NULL AS 同じキー, NULL AS 同じ値
FROM テーブルA A
UNION ALL
SELECT B.キー, 'テーブルB' AS フラグ, NULL AS 項目1, B.項目2, B.項目3, C.キー AS 同じキー, C.項目3 AS 同じ値
--FROM テーブルB AS B
FROM (SELECT * FROM テーブルB B WHERE EXISTS (SELECT * FROM テーブルA A WHERE A.キー = B.キー)) B
LEFT JOIN テーブルB C ON B.項目2 = C.項目2 AND B.キー <> C.キー
ORDER BY 1, 2, 4;

で希望の結果になると思われます。
(Oracleだとテーブル別名指定時にASは使えないので消してあります)
この回答でうまくいくようであれば、ベストアンサーはyorozu_yaさんにお願いしますm(__)m

投稿日時 - 2011-05-06 10:29:20

あなたにオススメの質問