我们有表A和表B,我们需要的数据在表A中,我们使用表B来验证我们有匹配id的情况。如果id不匹配,我们可以选择它而不需要验证,但如果它们匹配,我们需要检查date是否在date1和date2之间。我们只检查B中的记录,如果它们在A中匹配;(例如,我们可以忽略表B中的id=4,因为它不在表A中);我们只需要A表中的数据。
我花了太多时间创建sql来选择:
表A中不属于表B的所有内容(id, f.e id=1,3),并选择匹配记录A.date在B.date1和B.date2之间的匹配记录(如果匹配且不在B.date2之间,则不选择)
TABLE A
id date col1
1 5/08/2021 11223344
2 15/06/2021 22334411
2 15/04/2021 22223344
3 10/11/2021 22223311
TABLE B
id date1 date2
5 5/08/2021 5/09/2021
2 15/05/2021 15/07/2021
2 15/08/2021 15/09/2021
4 15/08/2021 15/10/2021
结果应该是这样的:
id date col1
1 5/08/2021 11223344
3 10/11/2021 22223311
2 15/06/2021 22334411
因为您想保留A
中满足您条件的所有行-大概没有重复-我建议使用exists
和' not exists:
select a.*
from a
where exists (select 1
from b
where a.id = b.id and
a.date between b.date1 and b.date2
) or
not exists (select 1
from b
where a.id = b.id
);
如果b
中有多个匹配的行,则使用left join
的解决方案可以返回重复的行。
对您的问题进行改进,将添加您在查询中的最后一次尝试。但据我所知,你的问题可以这样解决:
SELECT A.ID, A.date, A.col1 FROM A
LEFT JOIN B ON A.id = B.id
WHERE (A.Date BETWEEN B.date1 AND b.date2) OR B.date1 IS NULL
- LEFT JOIN保留表A的所有记录
- 。Date BETWEEN B.date1 AND b.date2根据您的条件筛选匹配行
- B。Date1 IS NULL对于A中没有匹配的行