🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Oracle

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

SQL

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

Q&A

解決済

1回答

1262閲覧

【二つのテーブルからデータ抽出】SQL文を教えていただけませんでしょうか。

miyu-c

総合スコア1

Oracle

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

SQL

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

0グッド

0クリップ

投稿2021/03/17 09:12

編集2021/03/24 01:29

SQL文について教えて下さい。

OracleのSQL developerを使用しています。

使用するテーブルは2つ、AとBがあります。

TableA

CODENAME
66あっこ
378あいこ
00あきこ
00あつし
66あっこ
378あつし
66あっこ
378あいこ
00あきこ
00あっこ
00あつし
378あつし

CODEには、最大5桁のランダムな数字が入っている。
先頭の数字は00

TableB

NUMBERNAME
186884マツコ
467田中
0000石橋
0000中田
0000石橋
467マツコ
0000鈴木
0000浅野
0000中田
756マツコ

NUMBERには、最大9桁のランダムな数字が入っている。
先頭の数字は0000

期待する結果

上記2種類のテーブルから、
先頭のCODEとNUMBER、NAMEを重複無しで表示したい。

イメージとしては、
各カラム内の値の重複をなくす感じです。

|CODE|NAME|NUMBER|NAME|
|:--|:--:|
|
|00|あきこ|0000|石橋|
|00|あつし|0000|中田|
|00|あっこ|0000|鈴木|
|||0000|浅野|
|

お手数をおかけし、何度も申し訳ございません。
よろしくお願いいたします。

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

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

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

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

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

miyu-c

2021/03/17 09:13

タグで間違えてMySQLにしてしまっていますが、Oracleです。よろしくお願いします。
sazi

2021/03/17 09:15

どのように重複を除外したいのかが明確ではありませんから、サンプルデータを示してください。
miyu-c

2021/03/17 09:27

ご返信ありがとうございます。 サンプルが無くわかりにくくて申し訳ございません。 ・AのCODEのほうは最大5桁のランダムな数字 ・Aの名称はあいこ、あっこ、あきこ、あつみ、あかつ、あかし、あっちゃんなど、(あ)から始まるありがちな名前がたくさん入っています。 ・BのCODEは最大9桁のランダムな数字 ・Bの名称は、マツコ、田中、石橋など、いわゆる普通の名前がはいっています。 上記説明で大丈夫でしょうか。 以上、よろしくお願いいたします。
sazi

2021/03/17 09:35

先ず、ここではなく質問を編集して追記して下さい。 それから除外したい重複の例も含めて下さい。
miyu-c

2021/03/17 10:54

お手数おかけして申し訳ございません。 先ほど、編集で追加いたしました。 お忙しい中、恐れ入りますがご確認の程よろしくお願いいたします。
sazi

2021/03/17 11:25

さっぱり分かりません。 サンプルに含まれていないものを条件に含めたりしていて内容の精査がされていません。 >A.NAME→あっこ、あつし、あつこ、あさの > (重複無し) テーブルできちんと示してください。 回答では無いですが、参考に回答しています。
sazi

2021/03/17 17:13 編集

さっぱり分かりません。 サンプルに含まれていないものが結果になったりしていて内容の精査がされていません。
sazi

2021/03/18 00:24

tableAとtableBの内容が重複しているサンプルにして下さい。 結果の条件に該当しているサンプルでないと意味がありません。
K_3578

2021/03/24 02:01

質問編集されてますが、質問者が期待されている結果は 「tableAでCODEが[00]の物で、NAMEが重複している場合1件のみ抽出」 「tableBでNUMBERが[0000]の物で、NAMEが重複している場合1件のみ抽出」 という結果を結合して表示する。というものでしょうか。
miyu-c

2021/03/24 04:40

K_3587さん コメントありがとうございます。その理解であっております。 強いて言えば、コードとナンバーが一番小さいものと考えてもらっても構いません。
K_3578

2021/03/24 04:44

じゃあsaziさんの回答で解決すると思われます。
sazi

2021/03/24 05:00 編集

> 強いて言えば、コードとナンバーが一番小さいものと考えてもらっても構いません。 それは、以下の条件と全然別物ですけど? ・tableAでCODEが[00] ・tableBでNUMBERが[0000] 必ず00や0000が一番小さくて必ず存在するという前提があるなら、結果的に同じにはなるでしょうが。
guest

回答1

0

ベストアンサー

重複が何を意味しているのか分かりませんので、その条件を含めずに回答します。

tableAとTableBを何らかの条件で抽出したものを、単に横並びで展開させるという事だとします。
これを一度のSQLで行うには、行を揃える条件が必要になります。
これについてはROW_NUMBER()を使用して、行の番号を生成し、それを結合条件とします。
※以下は行の並びについての条件は無し(=Null)にしています。

SQL

1select ta.*, tb.* 2from (select t.*, row_number() over(order by null) as seq from tableA t) ta 3 full join 4 (select t.*, row_number() over(order by null) as seq from tableB t) tb 5 on ta.seq=tb.seq

またfull joinにしていますので、同じ行数で揃えたい場合は inner joinとして下さい。

追記

重複に関する内容が質問に追記されましたので、その内容での回答です。
tableAに関する重複排除は、
・CODE=00のものを重複無しにする

SQL

1select code, name from tableA where code='00' group by code, name

tableBに関する重複排除は、
・NUMBER=0000のものを重複無しにする

SQL

1select number, name from tableB where number='0000' group by number, name

これを横に並べて表示するのは、先の回答に上記部分を展開します。

SQL

1select ta.*, tb.* 2from ( 3 select t.*, row_number() over(order by null) as seq 4 from (select code, name from tableA where code='00' group by code, name) t 5 ) ta 6 full join 7 ( 8 select t.*, row_number() over(order by null) as seq 9 from (select number, name from tableB where number='0000' group by number, name) t 10 ) tb 11 on ta.seq=tb.seq

投稿2021/03/17 11:22

編集2021/03/24 02:36
sazi

総合スコア25327

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

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

miyu-c

2021/03/24 05:20 編集

sazi様 お陰様で期待する値が抽出できました! 解説までご丁寧にしていただきありがとうございます。 理解することができ助かりました。 また、質問の仕方も勉強になりました。 振り返ってみると、確かに最初の情報では回答することが出来ないなと反省しました。 お手数をおかけし、お掛けし申し訳ございませんでした。 それでも、最後まで回答していただき本当にありがとうございました。 悩みが一つ減りました。 数年後にスキルが上がった際にはsazi様のように質問の仕方から教えられるように頑張ります。 また、機会がございましたら、よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問