![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。
最近oracleを使い始めてSQLで表の結合を書く場面があるんですが
LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。
LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。
それが嫌で(+)を使っていたんですが
今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。
(AテーブルとBテーブル、AテーブルとCテーブルなど?)
こういう場合はどうすれば良いのでしょうか?
とりあえず副参照をFROMに指定して対処してるんですが
何かきちんとした書き方があるのでしょうか?誰か教えて下さい。
No.1ベストアンサー
- 回答日時:
話が抽象的すぎて何を答えれば良いのか分からない・・・・ 「エラーになってしまいます。
」が指す意味が分かりづらいですね。ORA-xxxxxが発生するのか、意図したレコードが抽出されないのか。もう少し具体的に書くと良いでしょう。また、その際に2テーブルの列定義(抜粋でも)やSQLのON句などは書かないと回答はつかないでしょうね。Oracleの10g以降を使用しているのであればもはや(+)を使う理由はありません。LEFT JOINを使うべきです。
ところで、外部結合において良くある間違いとして以下のようなSQLがあります。ID列とNAME列があるテーブルA、Bがあり、
SELECT A.ID, B.ID, B.NAME FROM A LEFT JOIN B ON
A.ID = B.ID
AND
B.NAME = 'テスト'
というSQLを発行するとします。これは外部結合が全く意味をなさないSQLになります。これは
SELECT A.ID, B.ID, B.NAME FROM A LEFT JOIN B ON
A.ID = B.ID
AND
'テスト' = B.NAME
というSQLでないといけません。つまり、LEFT JOINのON句に指定される結合条件は、外部結合されるBが全て右側に来なくてはいけません。初歩的ですがありがちなミスなので覚えておくと良いでしょう。また、場合によってはB側をサブクエリーにするというテクニックが適用できる事もあります。
SELECT A.ID, B.ID, B.NAME FROM A
LEFT JOIN (SELECT * FROM B WHERE NAME = 'テスト') B
ON A.ID = B.ID
回答ありがとうございます。今は
>サブクエリーにするというテクニック
これで対処してるって状態です。
>A.ID = B.ID
>AND
>'テスト' = B.NAME
正直どっちに固定値を書いたか記憶がないんですよね。
順番が逆だとエラーになるんでしょうか?
それとも単純に書き間違えたのかな…。
とりあえず、会社じゃないと確認出来ないんで来週確認してみます。
No.2
- 回答日時:
回答についてはNo.1さんのおっしゃるとおりなのですが、
>ところで、外部結合において良くある間違いとして以下のようなSQLがあります。・・
というのはどういうことでしょうか?
たとえば
with a as (
select 1 id from dual
union all select 2 id from dual
)
,b as (
select 1 id ,'テスト' name from dual
union all select 2 id ,'' name from dual)
select
a.id aid,b.id bid,b.name
from a
left join b
on a.id = b.id
and b.name = 'テスト';
とした場合、
AIDBIDNAME
11"テスト"
2""""
となりますが、これは
>外部結合が全く意味をなさないSQL
なのでしょうか?
自分としては正しい外部結合になっていると思うのですが。
oracle10.2.0.1.0で確認しました。
便乗質問で申し訳ありませんが教えていただけたら幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Oracle SQL update方法 2 2022/06/22 14:07
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Access(アクセス) AccessVBAで任意の複数リンクテーブルをAccessVBAを動かす際に削除したいと考えておりま 1 2022/11/17 15:45
- MySQL 【MySQL】本当に困っています。詳しい方、ご教授よろしくお願いします。 1 2023/06/03 14:18
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
【Access】外部結合を行う前に抽出条件をつけたいのですが。。。
Excel(エクセル)
-
オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?
SQL Server
-
ACCESS での LEFT JOIN 時の WHERE 句の使用について
その他(データベース)
-
-
4
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
5
SQL SEREVER で選択した固定値との結合について質問です。
SQL Server
-
6
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
7
TortoiseSVNにおける削除ファイルの復旧
その他(開発・運用・管理)
-
8
Accessで文字列の長さによって、フィールドの幅を自動で合わせる方法
Excel(エクセル)
-
9
GROUP BYを行った後に結合したい。
Oracle
-
10
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
11
MS SQLServer のSQLで文字列の前にN:
その他(データベース)
-
12
含まない言い方ってどうしたらいいんでしょうか
日本語
-
13
件数とデータを同時に取得するには?
Oracle
-
14
単一グループのグループ関数ではありません。
Oracle
-
15
「マスタ」と「テーブル」の違いとはなんでしょうか?
Oracle
-
16
テーブルに存在しない列をselect文で出力する事はできないでしょうか?
PostgreSQL
-
17
Accessで数値型にNULLをInsertするとエラー
その他(データベース)
-
18
Accessクエリでの、LIKE条件
その他(データベース)
-
19
Accessでテーブル名やクエリ名一覧の抜き出し
Access(アクセス)
-
20
デザインビューで、連結式 を表示できません について
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
MERGE文を単体テーブルに対して...
-
SET句内で複数の条件を指定して...
-
select句副問い合わせ 値の個...
-
select insertで複数テーブルか...
-
固定値を含む結合と複数テーブ...
-
外部結合とor条件混在の記述方法
-
SELECTの結果で同一行を複数回...
-
他のテーブルを参照した値はupd...
-
SQLの書き方(チェックボックス)
-
unionの結果は集計はできないで...
-
SQL GROUPで件数の一番多いレコ...
-
Accessで別テーブルの値をフォ...
-
SELECTで1件のみ取得するには?
-
Date型にNULLをセットしたい V...
-
ファイル書込みで一行もしくは...
-
カレントレコードが無い事を判...
-
【MYSQL】asでリネームしてwher...
-
あるカラムのMAX値+1をINSERTし...
-
月別、販売員別の集計がわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select insertで複数テーブルか...
-
select句副問い合わせ 値の個...
-
SELECTの結果で同一行を複数回...
-
固定値を含む結合と複数テーブ...
-
MERGE文を単体テーブルに対して...
-
unionの結果は集計はできないで...
-
oracleの分割delete
-
SET句内で複数の条件を指定して...
-
複数テーブルのMAX値の行データ...
-
SQL GROUPで件数の一番多いレコ...
-
他のテーブルを参照した値はupd...
-
外部結合とor条件混在の記述方法
-
unionでマージした副問合せを結合
-
COUNTの取得方法(?)について...
-
集計後の数値が倍になる
-
SQLの書き方(チェックボックス)
-
副問い合わせのinsert文
-
OracleのSQLについて質問があり...
-
updateの一括実行
おすすめ情報