クエリから(読みやすさの形式)
SELECT
table1.*,
tb21.year,
tb21.month,
tb21.day,
tb22.year,
tb22.month,
tb22.day
FROM
table1
LEFT JOIN table2 tb21
ON table1.year = tb21.year
AND table1.month = tb21.month
AND (tb21.day = table1.day
OR tb21.day = table1.day+1)
LEFT JOIN table2 tb22
ON table1.year = tb22.year
AND table1.month = tb22.month
AND (tb22.day = table1.day+2
OR tb22.day = table1.day+3)
提供される制限のあるコンテンツとは別に、同じ日のデータを+ 1、+ 2、および+3で比較しようとしているところを見てみましょう。また、この例では、Table1とTable2の両方のテーブルで2016年6月1日から6月10日までのすべてのテーブルに10日しか存在しないと仮定します。
繰り返しになりますが、これは、レコードが非常に多い理由を単純化するために、各テーブルに問題の10個の日付がすべて含まれていることを前提としています。したがって、2016年6月1日の表1の日付の場合、表2(tb21バージョン)で修飾され、2つのレコードが返されます。 1つは6月1日、もう1つは6月2日です。これで、結果に2つのレコードが含まれます。今、あなたは再びそれを左に行います-表2(tb22バージョン)に参加します。今回は2日と3日を探していますが、そのうち6月3日と4日がテーブルにあります。したがって、デカルト結果が得られます。したがって、表1の6月1日のレコードには、次の4つのレコードがあります。
T1Year T1Month T1Day T21Day T22Day
2016 6 1 1 3
2016 6 1 1 4
2016 6 1 2 3
2016 6 1 2 4
ここで、テーブル2に6月2日に3つのエントリがあり、6月3日に3つのエントリがあり、データが非常に肥大化しているとします。これが、あなたがやろうとしていることについてより明確にする必要がある理由です。
したがって、探しているものに真のコンテキストがない場合は、インデックスを完全に利用していないという事実を無視してください。日の比較による日付に基づくORがあります。とにかくクエリに引き続き利用する必要があります。