Dalla tua richiesta (formattazione leggibilità)
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)
A parte i tuoi contenuti restrittivi forniti, diamo un'occhiata al tuo tentativo di confrontare i dati dallo stesso giorno al giorno + 1, +2 e +3. Supponiamo anche che solo per questo esempio tu abbia solo 10 giorni nella tabella rappresentati come tutti i giorni dal 1 giugno al 10 giugno 2016 in entrambe le tabelle Table1 E Table2.
Ancora una volta, questo presuppone che ogni tabella abbia tutte e 10 le date in questione solo per scopi semplicistici del motivo per cui così tanti record. Quindi, per la data della tabella 1 del 1 giugno 2016, si qualificherà con la tabella 2 (versione tb21) e restituirà DUE record. Uno per il 1 giugno e un altro per il 2 giugno. Quindi ora hai DUE record nel tuo risultato. Ora, lo fai di nuovo, unisciti a sinistra alla tabella 2 (versione tb22). Questa volta stai cercando 2 e 3 giorni fuori, di cui hai il 3 e 4 giugno nella tabella. Quindi stai ottenendo un risultato cartesiano. Quindi, per il record del 1 giugno nella tabella 1, ora hai 4 record come segue.
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
Ora, supponiamo che la tua tabella 2 abbia 3 voci il 2 giugno e 3 voci il 3 giugno e che i tuoi dati si gonfieranno. Questo è il motivo per cui devi fornire maggiori chiarimenti su ciò che stai cercando di fare.
Quindi, non avendo un vero contesto su ciò che stai cercando, ignora il fatto che non sta utilizzando perfettamente il tuo indice. Hai un OR basato sulla data tramite i confronti dei giorni. Dovrebbe comunque essere utilizzato per la query.