以下の条件での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で取得したいのですが
どちらの場合でも取得の方法に悩んでいます。
どのような方法で取得できるのでしょうか?
No.1ベストアンサー
- 回答日時:
環境が無いので試してませんが、こんな感じかな。
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に無いものをどうするかは考慮してません。
No.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Oracle SQL update方法 2 2022/06/22 14:07
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
update文で改行を入れる
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
sqlplusで表示が変なので、出力...
-
SQL 複数テーブルのupdate
-
ROWNUMでUPDATEをしたいのです...
-
SQL*LoaderでCSVから指定した列...
-
SQLで違うテーブルの値を比較し...
-
SQLでSUMなどの関数でデータが...
-
半角英数文字の抽出がしたい。
-
SELECT文で指定桁数分抽出する...
-
特定のカラムが更新されたとき...
-
DELETE文とロックについて
-
マテリアライズド・ビューの変更
-
SQL update方法
-
SQLについて教えて下さい。 主...
-
カラム位置変更
-
oracle 複数列を1列にまとめる
-
LONG型の先頭250バイトを Varch...
-
複数テーブルでの件数検索について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
ROWNUMでUPDATEをしたいのです...
-
SQL 複数テーブルのupdate
-
update文で改行を入れる
-
sqlplusで表示が変なので、出力...
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
特定のカラムが更新されたとき...
-
SQLで違うテーブルの値を比較し...
-
件数とデータを同時に取得する...
-
カラム位置変更
-
UPDATE文
-
DELETE文とロックについて
-
数値をNUMBER型にするかCHAR型...
-
半角英数文字の抽出がしたい。
-
テーブルやカラムの物理名のネ...
-
DBからタブ区切りのCSVデータを...
-
Oracleのview、synonymをCOMPIL...
-
SELECT文で指定桁数分抽出する...
おすすめ情報