SQL Cross Join は、両方のテーブルの Cartesian Product を返します。 デカルト積とは、テーブル1の行数とテーブル2の行数を掛け合わせたものです。 SQL Server Cross Joinでは、2つのテーブルを結合するために共通のカラムを必要としません。
上のスクリーンショットから、SQL Server Cross Joinが2つのテーブルのデカルト積を表示することが容易に理解できるでしょう。 つまり、テーブルAのすべてのレコードがテーブルBのすべてのレコードと結合しているということです
SQL Cross Join Syntax
SQL ServerにおけるCross Joinの構文は
-- SQL Server Cross Join SyntaxSELECT Table1.Column(s), Table2.Column(s),FROM Table1 CROSS JOIN Table2 --OR We can Simply Write it asSELECT Table1. Column(s), Table2. Column(s),FROM Table1, Table2
このSQL Server Cross Joinの例では、2つのテーブル(EmployeeとDepartment)を使用します。 Employeeテーブルに存在するデータ
SQL Server Departmentテーブルに存在するデータは以下の通りです。
SQL Cross Join Select * Example
次のCross Joinクエリは、SQL ServerのDepartmentテーブルに存在するすべての列を表示します。 は、従業員 & 部署テーブル
-- SQL Server Cross Join ExampleUSE SQLTESTGOSELECT * FROM CROSS JOIN ;
以下のJoinスクリーンショットを見ると、120レコードが表示されています。 120件のレコードが表示されています。 これは、Employeeの15行とDepartmentテーブルの8行を掛け合わせていることを意味します
注意:個別のカラム名を選択することをお勧めします。
SQL Cross Join Select Few Columns Example
先に述べたように、不要なカラムを避けるために、SELECTステートメントの後に必要なカラムを選択してください。 次のクロス ジョイン クエリは、Employee テーブルと Department テーブルに存在するカラムの Cartesian Product を表示します。
-- SQL Server Cross Join ExampleUSE SQLTESTGOSELECT , ,FROM CROSS JOIN
SQL Cross Join 曖昧なカラム
上記のTransactクエリは、両方のテーブル(EmployeeとDepartment)のカラム名が上記のように異なっていれば、問題なく動作します。 もし、両方のテーブルに同じカラム名があった場合はどうなるでしょうか? 上記のような方法では、エラーが発生してしまいます。
実際の例を挙げてみましょう。
-- SQL Server Cross Join ExampleUSE SQLTESTGOSELECT , ,id ,FROM CROSS JOIN
ご覧の通り、エラーが発生しています。 Ambiguous column name id. これは、id 列が Employee テーブルと department テーブルの両方に存在するためです。
この種の問題を解決するには、常にテーブル名をカラム名の前に使用する必要があります。 次のCross Joinクエリでは、カラム名の前にALIASテーブル名を使用しています。 この方法では、部門テーブルに属するid列を探していることをサーバーに知らせることができます。
上記のクロスジョインクエリは次のように書くことができます。
-- SQL Server Cross Join ExampleSELECT Emp. ,Emp. ,Dept.id ,Dept.FROM AS EmpCROSS JOIN AS Dept
Joinキーワードを使わないCross Join
CROSS JOINキーワードを使わずに結果を得ることもできます。
-- SQL Server Cross Join ExampleSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp,CROSS JOIN AS Dept--OR We Can simply Write it asSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp, AS Dept
SQL クロスジョインのWHERE句
クロスジョインで返される行数を制限する際に、クロスジョインと共にWHERE句を使用することができます。 ここでは、WHERE句をCross Joinと一緒に使用しています。
-- SQL Server Cross Join ExampleSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp, AS DeptWHERE Dept. = 'Software Developer'
Cross Join Order By Clause Example
クロスジョインでは、Order By Clauseを使ってレコードの順番を入れ替えることができます。
-- SQL Server Cross Join ExampleSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp, AS DeptWHERE Dept. = 'Software Developer'
となります。