Aus Ihrer Abfrage (lesbar formatiert)
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)
Abgesehen von Ihren restriktiven Inhalten, schauen wir uns an, wie Sie versuchen, die Daten von Tag zu Tag + 1, +2 und +3 zu vergleichen. Nehmen wir auch an, dass Sie nur für dieses Beispiel nur 10 Tage in der Tabelle haben, die sowohl in Ihren Tabellen Table1 als auch in Table2 als 1. Juni bis 10. Juni 2016 dargestellt werden.
Auch dies ist eine Annahme, dass jede Tabelle alle 10 fraglichen Daten enthält, nur um zu vereinfachen, warum so viele Datensätze vorhanden sind. Für das Datum von Tabelle 1 vom 1. Juni 2016 wird es also mit Tabelle 2 (tb21-Version) qualifiziert und ZWEI Datensätze zurückgegeben. Einen für den 1. Juni und einen für den 2. Juni. Jetzt haben Sie also ZWEI Datensätze in Ihrem Ergebnis. Jetzt machen Sie das noch einmal mit der linken Verknüpfung zu Tabelle 2 (tb22-Version). Diesmal suchen Sie 2 und 3 Tage aus, von denen Sie den 3. und 4. Juni in der Tabelle haben. Sie erhalten also ein kartesisches Ergebnis. Für den Datensatz vom 1. Juni in Tabelle 1 haben Sie nun 4 Datensätze wie folgt.
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
Nehmen wir nun an, Ihre Tabelle 2 hat am 2. Juni 3 Einträge und am 3. Juni 3 Einträge, und Ihre Daten werden extrem aufgebläht. Aus diesem Grund müssen Sie näher erläutern, was Sie zu tun versuchen.
Wenn Sie also keinen wahren Kontext zu dem haben, wonach Sie suchen, ignorieren Sie die Tatsache, dass Ihr Index nicht perfekt genutzt wird. Über die Tagesvergleiche haben Sie ein OR auf Basis des Datums. Es sollte trotzdem für die Abfrage verwendet werden.