CROSS JOIN
とINNER JOIN
の違いは何ですか?
CROSS JOIN:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status],
FROM
Customers
CROSS JOIN
Movies
内部結合:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status]
FROM
Customers
INNER JOIN
Movies ON Customers.CustomerID = Movies.CustomerID
どちらが優れていますか、またどちらを使用するのですか。
クロスジョインでは行は結合されません。各テーブルに100の行が1対1で一致している場合は、10.000の結果が得られ、Innerjoinは同じ状況で100の行のみを返します。
これら2つの例は同じ結果を返します。
クロスジョイン
select * from table1 cross join table2 where table1.id = table2.fk_id
内部結合
select * from table1 join table2 on table1.id = table2.fk_id
最後の方法を使う
これが、クロス結合と内部結合の最良の例です。
次の表を検討してください
表:Teacher
name __
x------------------------x
| TchrId | TeacherName |
x----------|-------------x
| T1 | Mary |
| T2 | Jim |
x------------------------x
表:Student
name __
x--------------------------------------x
| StudId | TchrId | StudentName |
x----------|-------------|-------------x
| S1 | T1 | Vineeth |
| S2 | T1 | Unni |
x--------------------------------------x
内部結合は、両方のテーブルを満たす行を選択します。
クラスの先生である先生とそれに対応する生徒を見つける必要があるとします。そのような状況では、JOIN
name__またはINNER JOIN
を適用する必要があります。
クエリ
SELECT T.TchrId,T.TeacherName,S.StudentName
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId
結果
x--------------------------------------x
| TchrId | TeacherName | StudentName |
x----------|-------------|-------------x
| T1 | Mary | Vineeth |
| T1 | Mary | Unni |
x--------------------------------------x
交差結合は最初のテーブルからすべての行と2番目のテーブルからすべての行を選択し、デカルト積として表示されます。つまり、すべての可能性があります
クラスの先生に関係なく、学校内のすべての先生と生徒を見つける必要があるとすると、CROSS JOIN
を適用する必要があります。
クエリ
SELECT T.TchrId,T.TeacherName,S.StudentName
FROM #Teacher T
CROSS JOIN #Student S
結果
x--------------------------------------x
| TchrId | TeacherName | StudentName |
x----------|-------------|-------------x
| T2 | Jim | Vineeth |
| T2 | Jim | Unni |
| T1 | Mary | Vineeth |
| T1 | Mary | Unni |
x--------------------------------------x
CROSS JOIN =(INNER)JOIN =カンマ( "、")
TL; DRSQL CROSS JOIN、(INNER)JOINとコンマ( "、")の間の唯一の違いは(評価順序の優先順位が低いコンマを除く)、(INNER)JOINです。 CROSS JOINとコンマはしませんがONがあります。
中間製品について
3つすべてが、各テーブルからの行のすべての可能な組み合わせの中間的な概念的なSQLスタイルのリレーショナル「デカルト」積、つまりクロスジョインを生成します。行数を減らすのはONまたはWHEREです。 SQLフィドル
SQL標準定義 <comma>はproduct(7.5 1.b.ii)経由、<cross join>は<comma>(7.7 1.a)経由、JOIN ON <検索条件>は<comma> plus経由でどこ(7.7 1.b)。
ウィキペディアによれば、
CROSS JOINは、結合内のテーブルから行のデカルト積を返します。つまり、最初のテーブルの各行と2番目のテーブルの各行を組み合わせた行が生成されます。
[...]結合の結果は、最初にテーブル内のすべてのレコードのデカルト積(またはクロス結合)を取り(テーブルAのすべてのレコードとテーブルBのすべてのレコードを組み合わせた)結果として定義できます。結合述部を満たすすべてのレコード。
「暗黙の結合表記法」は、SELECTステートメントのFROM節に結合するテーブルを単純にリストし、それらを区切るにはコンマを使用します。したがって、それはクロスジョインを指定します
OUTER JOINを再結合し、その中でONとWHEREを使用する場合は、 LEFT JOIN(OUTER JOIN)vs INNER JOIN の条件を参照してください。
テーブル間で列を比較するのはなぜですか?
重複行がない場合
すべてのテーブルは、特定のfill-in-the-[named-]空白ステートメントテンプレートから真のステートメントを作成する行を保持します。 (--準拠--から真の命題を特定の(特性)述語にします。)
実表には、DBA指定の文テンプレートから真の文を作成する行が含まれています。
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
結合の中間積は、そのオペランドのテンプレートのANDから真のステートメントを作る行を保持します。
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
ON&WHERE条件がANDされて、さらにテンプレートが作成されます。値はそのテンプレートを満たす行です。
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
特に、テーブル間で(SQL)等価性について列を比較するということは、テンプレートの結合テーブルの部分からの製品から保持されている行が、それらの列に対して同じ(NULL以外の)値を持つことを意味します。通常、テーブル間の等価性比較によって多くの行が削除されるのは偶然の一致です。必要で十分な行は、必要な行を特徴付けることです。
必要な行のテンプレートにSQLを書くだけです。
クエリ(およびテーブルと条件)の意味については、以下を参照してください。
2つの異なる列について別のSQLテーブルから一致データを取得する方法:内部結合または結合、あるいはその両方?
人間が読める形式の記述からSQLクエリを作成するための経験則はありますか?
「クロスジョイン」をオーバーロードしています
残念ながら、「クロスジョイン」という用語は次の目的で使用されます。
これらのさまざまな意味は混乱します。 (例:他の答えやコメントのように)
CROSS JOIN vs(INNER)JOIN vsコンマの使用
一般的な規則は次のとおりです。
通常、テーブルのペアではない条件もWHEREに対して保持されます。しかし、RIGHT、LEFTまたはFULL(OUTER)JOINへの引数に適切な行を取得するには、(n INNER)JOIN ONに入れる必要があります。
Re "コンマを使用しない"コンマの方が優先順位が低いため、明示的なJOINとコンマを混在させると誤解を招く可能性があります。しかし、CROSS JOIN、(INNER)JOIN、およびコンマの意味での中間生成物の役割を考えると、それをまったく使用しないという上記の規則の議論は不安定です。 CROSS JOINまたはコンマは、真の条件にある(INNER)JOINのようなものです。中間積、ONとWHEREはすべて、対応する述語にANDを導入します。ただし、INNER JOIN ONは考えられません。たとえば、ON条件を満たす入力行のペアが見つかった場合にのみ出力行が生成されます。それでも、条件を満たす交差結合行が返されます。 SQLでコンマを補足するON hadの唯一の理由は、OUTER JOINを書くことでした。もちろん、式はその意味を明確にする必要があります。しかし、明らかなことは、物事が何を意味すると解釈されるかによって異なります。
Reベン図2つの交差する円を持つベン図は、同じ入力に対するINNER、LEFT、RIGHT、FULL JOINの出力行の違いを示すことができます。また、ONが無条件にTRUEの場合、INNER JOINの結果はCROSS JOINと同じです。また、INTERSECT、UNION、EXCEPTの入力行と出力行を示すこともできます。また、両方の入力が同じ列を持つ場合、INTERSECTの結果は標準のSQL NATURAL JOINと同じになり、EXCEPTの結果はLEFT&RIGHT JOINを含む特定の慣用句と同じになります。しかし、それはnotが(INNER)JOINが一般的にどのように働くかを説明しています。それはただ一見したところもっともらしいです。それは、オンの特別な場合、PK(主キー)、FK(外部キー)および/またはSELECTの入力および/または出力の部分を識別できます。これを見るためにしなければならないのは、円で表される集合の要素は厳密には何かを識別することだけです。 (どのプレゼンテーションが混乱しているのかがはっきりしません。)一般的に、結合出力行は入力行とは異なる見出しを持ちます。そしてSQLテーブルはbag not sets行数{NULLあり)
両方の結合テーブルで一致する行だけを表示する結合は、内部結合と呼ばれます。これは、クエリーおよびビューデザイナでのデフォルトの結合です。
内部結合の構文
SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name
結合に関与したテーブルのデカルト積を生成するクロス結合。デカルト積のサイズは、最初のテーブルの行数に2番目のテーブルの行数を掛けたものです。
クロスジョインの構文
SELECT * FROM table_name1
CROSS JOIN table_name2
それとも別の方法でそれを書くこともできます
SELECT * FROM table_name1,table_name2
以下のクロスジョインのクエリを確認してください。
例
SELECT * FROM UserDetails
CROSS JOIN OrderDetails
または
SELECT * FROM UserDetails, OrderDetails
WHERE句が追加されている場合、クロスジョインは内部ジョインとして動作します。たとえば、次のTransact-SQLクエリは同じ結果セットを生成します。 http://technet.Microsoft.com/ja-jp/library/ms190690(v = sql.105).aspx を参照してください。
SQL Serverは、以下のより簡単な表記も受け入れます。
SELECT A.F,
B.G,
C.H
FROM TABLE_A A,
TABLE_B B,
TABLE_C C
WHERE A.X = B.X
AND B.Y = C.Y
この簡単な表記法を使用すれば、内部結合とクロス結合の違いを気にする必要はありません。 2つの "ON"句の代わりに、仕事をする単一の "WHERE"句があります。どの "JOIN" "ON"句がどこにあるのかを理解するのが困難な場合は、 "JOIN"表記をやめて上の簡単な表記を使用してください。
不正ではありません。
交差結合と内部結合は同じですが、内部結合ではデカルト積の結果の一部をブール値でフィルタリングする点が異なります。
table1
x--------------------------------------x
| fieldA | fieldB | fieldC |
x----------|-------------|-------------x
| A | B | option1 |
| A | B1 | option2 |
x--------------------------------------x
table2
x--------------------------------------x
| fieldA | fieldB | fieldC |
x----------|-------------|-------------x
| A | B | optionB1 |
| A1 | B1 | optionB2 |
x--------------------------------------x
cross join
A,B,option1,A,B,optionB1
A,B,option1,A1,B1,optionB2
A,B1,option2,A,B,optionB1
A,B1,option2,A1,B1,optionB2
inner join on field1 (only with the value is the same in both tables)
A,B,option1,A,B,optionB1
A,B1,option2,A,B,optionB1
inner join on field1
A,B,option1,A,B,optionB1
結合に使用しているフィールドのケースは1つだけであると判断するのは、データの設計上です。両方のテーブルをクロスジョインし、特別なブール式を実行する行のみを取得します。
結合を行っているフィールドが両方のテーブルでnullになる場合は、フィルタを渡します。 nullを回避または許可するための追加の規則を追加するのは、私たちまたはデータベース製造者の責任です。基本に従うと、それは単なるクロスジョインとそれに続くフィルタです。
内部結合を使用してクエリを作成している間に、条件が両方のテーブルで満たされた場合、つまり両方のテーブルの共通列が完全に一致した場合、レコードは両方のテーブルから取得します。
クロスジョインを使用してクエリを作成している間、結果は両方のテーブルのレコード数のデカルト積のようになります。たとえば、table1に2レコードが含まれ、table2に3レコードが含まれる場合、クエリの結果は2 * 3 = 6レコードになります。
それで、あなたがそれを必要とするまで、クロス結合に行ってはいけません。
内部結合は2つのテーブル間の一致レコードの結果を示します。クロス結合は2つのテーブル間の可能な組み合わせを示します。