
「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も見ています
-
性格悪い人が優勝
できるだけ性格悪い人になって回答をお願いします。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
人生で一番思い出に残ってる靴
皆さんの人生で一番思い入れのある靴の話を伺ってみたいです。
-
単二電池
あなたの家に何本ありますか?
-
あなたが好きな本屋さんを教えてください
どのくらいの規模間で、どのような本が並んでいるか、どのような雰囲気なのかなどなど...
-
外部結合とor条件混在の記述方法
Oracle
-
GROUP BYを行った後に結合したい。
Oracle
-
【Access】外部結合を行う前に抽出条件をつけたいのですが。。。
Excel(エクセル)
-
-
4
LEFT JOINの条件式で=’’を使用した場合
Oracle
-
5
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
6
SELECT 文の NULL列は?
PostgreSQL
-
7
ダブルクォーテーションを文字列として扱いたい
Visual Basic(VBA)
-
8
CASE文のエラーについて
Oracle
-
9
SQLで一定時間周期毎の抽出方法を教えてください
その他(データベース)
-
10
PL/SQLのコンパイルエラーについて(ignored)
Oracle
-
11
SPREAD(GrapeCity)のセルにフォーカスを設定するにはどうしたらいいのでしょうか?
Visual Basic(VBA)
-
12
2つのテーブルに共通するレコードを削除したい
Access(アクセス)
-
13
ACCESS での LEFT JOIN 時の WHERE 句の使用について
その他(データベース)
-
14
アクセスのエラー「クエリには出力フィールドが1つ以上必要です。」
その他(Microsoft Office)
-
15
VBのReturnの使い方
Visual Basic(VBA)
-
16
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
17
キャッシュを使わずにSELECTを投げたい
Oracle
-
18
Access テキスト型に対する指定桁での0埋め方法
その他(データベース)
-
19
ACCSESS2013VBA フォームのレコードソースを変更する
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
select insertで複数テーブルか...
-
GROUP BYを行った後に結合した...
-
select句副問い合わせ 値の個...
-
SELECTの結果で同一行を複数回...
-
写真のsql文空白をハイフン表示...
-
MERGE文を単体テーブルに対して...
-
複数テーブルのMAX値の行データ...
-
Access 2つのテーブルで数量...
-
外部結合とor条件混在の記述方法
-
副問い合わせのinsert文
-
unionの結果は集計はできないで...
-
結合と副問い合わせの違い
-
SQLの書き方(チェックボックス)
-
マテビューのNOTNULL設定について
-
OracleのSQLについて質問があり...
-
SET句内で複数の条件を指定して...
-
固定値を含む結合と複数テーブ...
-
Oracleでの文字列連結サイズの上限
-
カレントレコードが無い事を判...
-
アクセスでレポートの1印刷内...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select句副問い合わせ 値の個...
-
select insertで複数テーブルか...
-
SELECTの結果で同一行を複数回...
-
MERGE文を単体テーブルに対して...
-
SQL GROUPで件数の一番多いレコ...
-
固定値を含む結合と複数テーブ...
-
oracleの分割delete
-
外部結合とor条件混在の記述方法
-
unionでマージした副問合せを結合
-
複数テーブルのMAX値の行データ...
-
他のテーブルを参照した値はupd...
-
unionの結果は集計はできないで...
-
SQLの書き方(チェックボックス)
-
SET句内で複数の条件を指定して...
-
DELETE 文とEXISTSの使い方につ...
-
集計後の数値が倍になる
-
副問い合わせのinsert文
-
結合と副問い合わせの違い
-
異なるテーブルのレコード削除
おすすめ情報