- PR -

単純結合と内部結合

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/08/23
投稿数: 3
投稿日時: 2006-09-15 02:05
初歩的な質問です。

1.
SELECT TEST A INNER JOIN TEST B ON (
A.COLUMN1 = B.COLUMN2
)

2.
SELECT TEST A JOIN TEST B ON (
A.COLUMN1 = B.COLUMN2
)

INNER JOINとJOINでの結合の違いって何ですか?


Oracle10gで動かしてます。

テーブル TEST
----------------------------------------------------
COLUMN1 CHAR(4) CONSTRANT P_KEY PRIMARY KEY NOT NULL
COLUMN2 CHAR(4)

です。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2006-09-15 02:29
「単純結合」とあるが、外部結合の間違いじゃないの?
単純結合というのは、いわゆる直積のことだよ。

さて、内部結合と外部結合については、下記のリンクを参照して・・・、
と、までは考えたんだが、
教科書もろくに読んでないようだから、やめた。
どんな回答がつこうが、どうせ、教科書に載ってるのと同じものしかつきゃしないし。
未記入
会議室デビュー日: 2006/03/22
投稿数: 19
投稿日時: 2006-09-15 06:53
SQLマニュアルに書いてあります。
単純結合(simple join)と内部結合(inner join)は同一

inner_cross_join_clause::= の表記を見てもわかりますが
INNER を指定すると、内部結合を「明示的」に指定できます。とも書かれています。
つまり省略可能

あと直積(マニュアル表記では:デカルト積)は CROSS JOIN です。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2006-09-15 22:04
参ったなあ・・・。
エラソーに書き込んだだけに、よけいにみっともない。
すんませんです。
こういうのは、流した方が良いいのかしらん。orz
未記入
会議室デビュー日: 2006/03/22
投稿数: 19
投稿日時: 2006-09-16 00:29
単純結合で検索すると間違った内容が
相当昔からほぼトップに表示され続けていますから
勘違いしている人も結構いると思いますよ。

検索エンジンと個人サイトの内容をマニュアルで確認しないで信用していると
自分もたまに痛い目を見ます。(特に簡単と思っている内容ほど)
あんまりフォーローになっていないかな… ^^;
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-09-16 02:39
MySQLだと、

select * from a join b on true
select * from a join b
select * from a full join b on true
select * from a full join b
select * from a cross join b on true
select * from a cross join b

どれも等価になりますね。

Postgresのリファレンスを見ると、[INNER] JOINとかかれてますし、
a cross join bとa inner join b on trueが等価とかかれてますね。

わかったつもりっていうのはよくある事ですし、
上記の事も今調べてわかった事なので、
間違いがあっても、いい議論や勉強のネタになっていいですね〜。
未記入
会議室デビュー日: 2006/08/23
投稿数: 3
投稿日時: 2006-09-16 02:46
>Tetra様

返信遅れて申し訳ございません。
マニュアルにて確認しました。
自分の勉強と確認の不足です。
しかし助かりました。ありがとうございます。

基礎的なJOIN構文をまとめてみました。

■結合条件(ON句)による結合の分類

 等価結合(ON A = B)
 ・両方のテーブルに等しい値が存在する場合の条件。(例:外部キー参照)

 非等価結合(ON A BETWEEN 1 AND 100)
 ・両方のテーブルに等しい値が存在しないが、関連する値が存在する場合の条件。

■JOIN構文による結合の分類
 
 単純結合(JOIN ON)
 ・一致するデータがある場合に利用。(例:外部キーで参照)
 ・等価結合、非等価結合を同時に利用できる。

 内部結合(INNER JOIN)
 ●単純結合のJOINと動作は同じ。INNERをつけることによって結合方法を明示的にする。
 ・等価結合、非等価結合を同時に利用できる。

 外部結合(LEFT OUTER JOIN , RIGHT OUTER JOIN)
 ・片方のテーブルに一致しない値が存在し、一致しない値を持つ行も検索する場合に利用。
 ・結合列にNULL値を持つ行を検索する場合に利用。
 ・等しくない値も取得する場合に利用。
 ・OUTERを省略可能。
 ・等価結合、非等価結合を同時に利用できる。

 完全外部結合(FULL OUTER JOIN)
 ・両方のテーブルに一致しない値が存在し、一致しない値を持つ行を検索する場合に利用。
 ・結合列にNULL値を持つ行を検索する場合に利用。
 ・等しくない値も取得する場合に利用。
 ・OUTERを省略可能。
 ・等価結合、非等価結合を同時にも利用できる。

 直積結合(CROSS JOIN)
 ・「SELECT * FROM TEST1,TEST2」と「SELECT * FROM TEST1 CROSS JOIN TEST2」は同等。
 ・結合条件が省略されている。
 ・表内のすべての行を互いの表のすべての行に結合する。(テーブルAの行数×テーブルBの行数→直積の行数)
 ・DB2ではCROSS JOINを明示的に記述すると構文エラー。

 自然結合(NATURAL JOIN、JOIN USING)
 ・oracle9i以降のみの構文。
 ・両方の表で一致する名前とデータ型に基づいて自動的に結合。
 ・共通の列が複数存在すればそれらがすべて結合列として利用。
 ・共通の列が複数存在するが、その中の一部だけ使用する場合はUSING句を使用。
 ・結合列の名前は同じだが、データ型が異なる場合、USING句を使用。
 ・NATURAL JOIN句とUSING句は一緒には使えない。(互いに排他的)
 ・結合列は表名または別名で修飾できない。

 ※NATURAL JOIN結合対象列判定の順番
1 両方のテーブルの同じ列名を探す
1-1 列名が同じ場合、結合列の対象。2へ。
1-2 列名が異なる場合、結合列の対象外
2 同じ列名の型を比較
2-1 型が同じ場合に結合対象となる。
2-2 型が異なる場合、テーブルにデータが1件でもある場合は構文エラー。→JOIN USINGを使用

※型がCHARとVARCHARで異なる場合かつテーブルにデータが1件でもある場合でも構文エラーには発生しなく結合対象列となる。

>さいくろう様

自分はOracle 10g Bronze SQL基礎の参考書「EXAM PRESSオラクルマスター教科書」と
過去ログしか確認していませんでした。
Oracle Master 10g Bronzeの資格を取得したのですが、結合構文について、理解が
あいまいで、このような質問内容となってしまいました。
今後投稿する機会がありましたら、詳しく調べてから質問内容をよく考えます。
1

スキルアップ/キャリアアップ(JOB@IT)