Sql 加入从 A table 中选择记录和从 B table 中选择具有条件的匹配记录

Sql Join selecting records from A table and selecting matching records with a condition from B table

我们有 Table A 和 Table B,我们需要的数据在 table A 中,我们使用 table B 来验证我们有匹配 ID 的情况。如果 id 不匹配,我们可以 select 它而不进行验证,但如果它们匹配,我们需要检查日期是否在 date1 和 date2 之间。如果它们在 A 中匹配,我们只检查 B 中的记录; (f.e 我们可以在 table B 中忽略 id=4 因为它不在 A 中);而我们只需要来自 A table.

的数据

我花了太多时间来创建 sql 到 select:

来自TableA但不在tableB(ids,f.eid=1,3)和select匹配记录中的所有匹配记录A.date 在 B.date1 和 B.date2 之间(如果它匹配而不是在 select 之间)

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

您的问题的改进方法是在查询中添加您的最后一次尝试。 但据我了解,你的问题可以这样解决:

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 保留 table A
  • 的所有记录
  • A.Date BETWEEN B.date1 AND b.date2 根据您的条件过滤匹配的行
  • B.Date1 IS NULL 对于 A 中的行在 B
  • 中没有匹配项

因为您想保留 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 的解决方案可能会 return 重复行。