【问题标题】:Sql Join selecting records from A table and selecting matching records with a condition from B tableSql Join从A表中选择记录并从B表中选择符合条件的记录
【发布时间】:2021-08-14 09:31:02
【问题描述】:

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

我花了太多时间来创建要选择的 sql:

表 A 中不在表 B 中的所有内容(ids, f.e id=1,3),并选择匹配记录 A.date 介于 B.date1 和 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

【问题讨论】:

    标签: sql oracle plsql left-join


    【解决方案1】:

    因为您想保留A 中满足您条件的所有行——大概没有重复——我建议使用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 的解决方案可能会返回重复行。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 你能解释一下 B.date1 的作用是什么?
      • 是的,但我不太明白,如果我不添加 'OR B.date1 IS NULL' 会发生什么
      • Without OR B.Date1:​​如果 A 中有一条记录在 B 中没有匹配,则 B.Date1 和 B.Date2 的值为 NULL 并且 A.Date 永远不会介于 NULL 和 NULL 之间并且记录不会显示在结果中。
      猜你喜欢
      • 2022-01-09
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多