Я пытаюсь присоединиться к двум таблицам, в которых есть дата проверки. Результаты должны отображаться только в том случае, если контрольная дата в первой таблице равна дате проверки во второй таблице. ИЛИ, если контрольная дата в обеих таблицах находится в пределах 10 дней друг от друга.
У меня две таблицы:
t1 table: company_id, expected_checkdate
t2 table: company_id, actual_checkdate
Утверждение 4: если acutal_checkdate = expected_checkdate, то не проверяйте других, которые находятся в течение 10 дней
LEFT OUTER JOIN t2 ON t1.actual_checkdate = t2.expected_checkdate
OR t1.actual_checkdate
BETWEEN DATE_ADD(t2.expected_checkdate, INTERVAL -10 DAY)
AND DATE_ADD(t2.expected_checkdate, INTERVAL 10 DAY)
AND t1.company_id = t2.company_id
Проблема в том, что я запускаю это в течение одного месяца. Я вижу много дубликатов, потому что за один месяц может быть 2 записи actual_checkdate или 2 expected_checkdate.
|---------------------|------------------|------------------|
| company_id | actual_checkdate |expected_checkdate|
|---------------------|------------------|------------------|
| 12 | 2018-01-05 | 2018-01-05 |
|---------------------|------------------|------------------|
| 12 | 2018-01-19 | 2018-01-19 |
|---------------------|------------------|------------------|
| 12 | 2018-01-05 | 2018-01-19 | -- incorrect
|---------------------|------------------|------------------|
| 12 | 2018-01-19 | 2018-01-05 | -- incorrect
|---------------------|------------------|------------------|
| 13 | 2018-01-12 | 2018-01-20 |
|---------------------|------------------|------------------|
| 14 | 2018-01-26 | 2018-01-36 |
|---------------------|------------------|------------------|
Первые две и последние две строки верны. Третья и четвертая строки не должны отображаться, потому что они являются дубликатами первой и второй строк. Пожалуйста, помогите мне с присоединением выше.
Вы можете переписать условие JOIN
следующим образом:
FROM t1
JOIN t2 ON t1.company_id = t2.company_id AND
(t1.actual_checkdate = t2.expected_checkdate OR
t1.actual_checkdate BETWEEN
DATE_SUB(t2.expected_checkdate, INTERVAL 10 DAY)
AND DATE_ADD(t2.expected_checkdate, INTERVAL 10 DAY)
AND NOT EXISTS (SELECT * FROM t1 WHERE t1.actual_checkdate = t2.expected_checkdate AND t1.company_id = t2.company_id)
)
Предложение NOT EXISTS предотвратит совпадение на близлежащей дате, если существует фактическое совпадение.