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

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

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

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

SQL

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

Q&A

解決済

3回答

2475閲覧

oracle full joinが使えない場合の代用

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

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

SQL

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

0グッド

0クリップ

投稿2017/07/12 05:36

いつもお世話になっております。
結合前テーブル
table1が基準です。

名前と番号が一致した場合はtable1に縦と横を結合しさせて
一致しなかったものはtable1にtable2のその行をくっつける
sqlを書きたいのですが、

sql

1SELECT * FROM newafter T1 2FULL JOIN later T2 3ON(T1.name = T2.name AND T1.num = T2.num) 4;

を実行すると(nameを名前、numを番号と思っていただければ大丈夫です)
エラー画面
が出てしまい使えません。

結合後のイメージはこうなっています。
結合後

別の方法を探しているのですが全く見つかりません。

分かる方がいましたら、力をお貸しください。
よろしくお願い致します。

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

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

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

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

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

SVC34

2017/07/12 06:28 編集

エラーメッセージからすると、使用されているのはMySQLでは?OracleならFULL JOINは使用できます。
退会済みユーザー

退会済みユーザー

2017/07/12 07:33

そうなのですか。それはわからなかったです。だとしたら、mysqlではfulljoinみたいなことは出来ないのでしょうか?
guest

回答3

0

やり方はいろいろありますが、
1.「結合後のイメージ」の(名前、番号)の表をつくる
2.1の表にtable2をleft joinしてぶら下げる
でとかはどうでしょう?
"「結合後のイメージ」の(名前、番号)"の表があったとしてこれを仮に"tableX"と名付けておくと

SQL

1//SQL1 2SELECT x.名前,x.番号,t2.,t2.3FROM tableX x 4LEFT join table2 t2 ON x.名前=t2.名前 AND x.番号=t2.番号

で、tableXはどう作るかというとこれで作れる。

SQL

1//SQL2 2SELECT 名前,番号 FROM table1 UNION SELECT 名前,番号 FROM table2

SQL2をSQL1に代入して

SQL

1//SQL2 2SELECT x.名前,x.番号,t2.,t2.3FROM (SELECT 名前,番号 FROM table1 UNION SELECT 名前,番号 FROM table2) x 4LEFT join table2 t2 ON x.名前=t2.名前 AND x.番号=t2.番号

一応完成。
(追記)
一応完成なんですが、性能とかの問題になるとまた別です。たとえば

SQL

1//SQL3 2SELECT t1.名前,t1.番号,t2.,t2.FROM table1 t1 LEFT JOIN table2 t2 ON t1.名前=t2.名前 AND t1.番号=t2.番号 3UNION 4SELECT 名前,番号,,FROM table2

こっちの方が大概の場合効率的でしょう。いずれもUNIONが重複をマージするという仕様を利用してますが、SQL2はキーの重複を除いてからキーでない情報を付加しているのに対し、SQL3は重複ありで抽出してから重複を除去してます。
※性能云々はおいておいてSQL2の方が論理的にはわかりやすいと思うのは個人的な感想。

投稿2017/07/12 12:10

編集2017/07/13 01:24
kurokoba

総合スコア276

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

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

退会済みユーザー

退会済みユーザー

2017/07/13 07:51

回答ありがとうございます。 mysqlだと面倒なんですね それなら、oracleの環境を作った方が これから同じ局面が来た時に楽そうですね
guest

0

FULL JOIN なのだからLEFT JOINとRIGHT JOINをUNIONしたらどうでしょう。
(試してません)

SQL

1SELECT * FROM newafter T1 2LEFT JOIN later T2 3ON(T1.name = T2.name AND T1.num = T2.num) 4UNION 5SELECT * FROM newafter T1 6RIGHT JOIN later T2 7ON(T1.name = T2.name AND T1.num = T2.num) 8;

投稿2017/07/12 08:33

shoko1

総合スコア372

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

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

退会済みユーザー

退会済みユーザー

2017/07/13 07:51

回答ありがとうございます。 mysqlだと面倒なんですね それなら、oracleの環境を作った方が これから同じ局面が来た時に楽そうですね
shoko1

2017/07/13 08:15

長らくSQLに関わっていますが、 full join がどうしても必要だったことは記憶にありません。一時的にSQLを使いたいのであれば何でもよいのですが、今後もSQLに関わるのであればoracleのSQLしか使えないのは避けた方がよいと思われます。
guest

0

ベストアンサー

A5M2でデータベースを新たに追加して
oracle接続のものを選択して、
cmdでユーザーを作って権限を付与して
そちらでsqlを作ることにしました。

投稿2017/07/13 07:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問