Sql Join从A表中选择记录,并从B表中选择符合条件的记录



我们有表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中没有匹配的行

最新更新