2017-06-08 6 views
-1

私は条件付きクロスジョインがWHERE句で指定された条件を持つ必要があり、なぜ 'ON'句で動作しないのか疑問に思っています。 コンパイル例えば、リンクを参照してください:http://rextester.com/IKY8693CROSS JOIN条件はWHERE句のみの 'ON'句で機能しないのはなぜですか?

ビジネスコンテキスト:私は3番目のテーブルに対して参加を左にするために、ギャップを埋めるために、開始日と終了日の間の日付のリストを生成する必要があり、そのようなゼロ/こと特定の月にnullが返されます。

私はこれをどのようにしましたか:YYYYMMの開始日と終了日を含むユーザーの表を例にとりましょう。

| user_id | start_yearmonth | end_yearmonth | 
|---------|-----------------|---------------| 
| u9876 | 201504   | 201610  | 
| u5564 | 201602   | 201612  | 
| u4435 | 201606   | NULL   | 

クロス結合されるテーブルは、希望のYYYYMM日付の表です。

| yearmonth | 
|-----------| 
| 201601 | 
| 201602 | 
| 201603 | 
| 201604 | 
| 201605 | 
| 201606 | 
| 201607 | 
| 201608 | 
| 201609 | 
| 201610 | 
| 201611 | 
| 201612 | 
| 201701 | 
| 201702 | 

A CROSS句が働く場所での条件で登録しようが、条件が「ON」句にある場合、これは動作しません。何故ですか?

SELECT 
    * 
FROM 
    user_tbl 
    CROSS JOIN date_range 
WHERE 
    user_tbl.start_yearmonth <= date_range.yearmonth 
    AND (user_tbl.end_yearmonth >= date_range.yearmonth 
     OR user_tbl.end_yearmonth IS NULL) 
ORDER BY 
    user_tbl.user_id, date_range.yearmonth ; 
+6

どういう意味ですか?クロスジョインは 'on'をサポートしていません。あなたは2つのセットのデカルト積として考えることができます、 'on'は理にかなっていません。 – freakish

+1

私の質問ははっきりしていると思う - 私は具体的には** WHY **のクロス結合は 'オン'をサポートしていないと頼んでいる。 'ON'は2つのテーブル間に条件を作成するために使用されますが、そうではありませんか? – psrpsrpsr

+3

はい、クロスジョインで条件を作成しません。他のタイプの結合には 'on'条件があります**必須**。そのような単純な。クロスジョインに条件を追加する場合は、クロスジョインステートメントの外側で条件を実行する必要があります。 – freakish

答えて

2

CROSS JOINは、2つのテーブル間で完全なデカルト積を実行するSQL演算子です。それはデカルト積であるため、操作の間に条件を許可しないため、フィルタリング操作(WHERE条件)でのみその結果を制限できます。

JOIN(INNERとOUTER JOIN、つまり)演算子は、演算子のON部分で表されるフィルタ演算子とともに単純にデカルト積であり(実際にはSQLの元の構文ではJOIN演算子はなく結合条件がWHERE部分に常に表記されている製品を示す「カンマ」表記)。

例:

"古い" の表記: "現代" の表記に相当

SELECT ... 
FROM table1 t1, table2 t2 
WHERE t1.attribute = t2.attribute 

SELECT ... 
FROM table1 t1 INNER JOIN table2 t2 ON t1.attribute = t2.attribute 

しばらく、デカルト積のため:

「古いです記法:

「現代」の表記と同等の210
SELECT ... 
FROM table1 t1, table2 t2 

SELECT ... 
FROM table1 t1 CROSS JOIN table2 t2 

つまりは、CROSSは条件が実際に内部結合のいくつかの種類である必要とする登録しよう。

+0

空気のない素晴らしい答え、ありがとう! – psrpsrpsr

+0

標準のSQLでは、(INNER)JOINでONを使用する必要があります。 – philipxy

関連する問題