我试图加入两个都有检查日期的表。仅当第一个表中的检查日期等于第二个表中的检查日期时,结果才会显示。或者,如果两个表中的检查日期在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 |
|---------------------|------------------|------------------|
前两行和后两行是正确的。第三行和第四行不应显示,因为它们是第一行和第二行的副本。请帮我完成上面的联接。
答案 0 :(得分:0)
您可以将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子句将阻止在附近日期进行匹配。