質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2567閲覧

SQLで2つの表の和集合をとるとき、重複する値は優先される表から取得したい

Jin513

総合スコア1

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/10/02 10:05

編集2020/10/02 10:42

前提・実現したいこと

下記2つの表をSQLで結合したいです。
IDがAとBで重複し、同じIDでもAとBで名称がことなるため
IDが重複する場合はAの名称を出力したいです。
また、Bにのみ存在するIDについてはBの名称を出力したいです。
SQLの書き方を教えてください。

入力:A

ID親ID名称
110あああ
220いいい
330ううう

入力:B

ID名称
1ああああ
2いいいい
4ええええ

出力:

ID親ID名称
110あああ
220いいい
330ううう
4nullええええ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/10/02 10:37

SQLだけでは分かりませんので、DBの種類をタグに追加して下さい。
Jin513

2020/10/02 10:43

oracleのタグを追加しました。よろしくお願いします
guest

回答2

0

ベストアンサー

SQL

1select coalesce(a.ID, b.ID) as ID, a.親ID, coalesce(a.名称, b.名称) as 名称 2from a full outer join b on a.ID=b.ID

上記では、完全外部結合(full join)により結合し、coalesce()によって優先を決定しています。

以下は同じ結果ですが、補集合をunionする方法です。

SQL

1 select a.ID, a.親ID, a.名称 2 from a left join b on a.ID=b.ID 3union all 4 select b.ID, Null, b.名称 5 from b left join A on a.ID=b.ID 6 where a.ID is Null

それぞれ、実行計画でコストの確認をしてみた方が良いと思います。
以下古い記事なので、改善されているかもしれませんけど参考に。
津島博士のパフォーマンス講座 第44回 SQL自動変換の注意点について

投稿2020/10/02 11:02

編集2020/10/02 14:18
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jin513

2020/10/06 07:06

coalesceを利用するとわかりやすいですね。回答ありがとうございます
guest

0

FULL OUTER JOINをしてCASE文で条件分岐すれば可能です。

投稿2020/10/02 10:08

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jin513

2020/10/02 11:02

CASE文の書き方がわからなかったのでWHEREで書いたのですが、このようなイメージでしょうか A FULL OUTER JOIN (SELECT * FROM B WHERE NOT EXISTS ( SELECT ID FROM A WHERE A.ID=B.ID )) ON A.ID=B.ID
gentaro

2020/10/02 11:28

「わからない」とだけ言われても、私はあなたではないので、何がわからないのかわかりません。 リファレンス等を読み、ご自身で単純なコードで試すところから始め、何が「わからない」のかを言語化してください。
Jin513

2020/10/06 07:06

理解が浅いまま質問してしまい、すみませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問