
「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も見ています
-
GROUP BYを行った後に結合したい。
Oracle
-
外部結合とor条件混在の記述方法
Oracle
-
LEFT JOINの条件式で=’’を使用した場合
Oracle
-
-
4
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
5
INSERT文でフィールドの1つだけを他のテーブルから取ってきた値を入れたい
その他(データベース)
-
6
ダブルクォーテーションを文字列として扱いたい
Visual Basic(VBA)
-
7
【Access】外部結合を行う前に抽出条件をつけたいのですが。。。
Excel(エクセル)
-
8
2つのテーブルに共通するレコードを削除したい
Access(アクセス)
-
9
Access2007でSQLの複数列副問い合わせについて
その他(データベース)
-
10
外部キーが設定されているテーブルのupdateについて
PostgreSQL
-
11
アクセスのエラー「クエリには出力フィールドが1つ以上必要です。」
その他(Microsoft Office)
-
12
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
13
キャッシュを使わずにSELECTを投げたい
Oracle
-
14
Access テキスト型に対する指定桁での0埋め方法
その他(データベース)
-
15
ACCSESS2013VBA フォームのレコードソースを変更する
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
oracleの分割delete
-
select insertで複数テーブルか...
-
select句副問い合わせ 値の個...
-
SELECTの結果で同一行を複数回...
-
複数テーブルのMAX値の行データ...
-
SET句内で複数の条件を指定して...
-
件数を取得する方法
-
MERGE文を単体テーブルに対して...
-
固定値を含む結合と複数テーブ...
-
unionの結果は集計はできないで...
-
結合と副問い合わせの違い
-
unionでマージした副問合せを結合
-
updateの一括実行
-
副問い合わせのinsert文
-
Oracleでの文字列連結サイズの上限
-
OracleのSQL*PLUSで、デー...
-
Accessで別テーブルの値をフォ...
-
レコードが存在しなかった場合
-
[Access]異なるレコード間の文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select句副問い合わせ 値の個...
-
select insertで複数テーブルか...
-
SELECTの結果で同一行を複数回...
-
MERGE文を単体テーブルに対して...
-
外部結合とor条件混在の記述方法
-
固定値を含む結合と複数テーブ...
-
oracleの分割delete
-
複数テーブルのMAX値の行データ...
-
unionでマージした副問合せを結合
-
SQL GROUPで件数の一番多いレコ...
-
SET句内で複数の条件を指定して...
-
他のテーブルを参照した値はupd...
-
unionの結果は集計はできないで...
-
COUNTの取得方法(?)について...
-
結合と副問い合わせの違い
-
マテビューのNOTNULL設定について
-
SQLの書き方(チェックボックス)
-
DELETE 文とEXISTSの使い方につ...
-
ある条件を持たないレコードの抽出
おすすめ情報