SQL查询,该查询检查t1中具有日期范围的每一行在该日期范围内t2中是否存在任何记录的日期?

SQL查询,该查询检查t1中具有日期范围的每一行在该日期范围内t2中是否存在任何记录的日期?,sql,Sql,如果我有两张这样的桌子: 表1 Start | END |更多列。。。 ------------------------------------------ 2019-10-20 | 2019-10-21 |... 表2 日志ID |日期 -------------- 1 | 2019-10-20 2 | 2019-10-22 我尝试过使用CASE WHEN,Boolean,但我怀疑我的逻辑在某个地方是错误的 我想返回一个结果表,其中包含表1中的所有列,另外一列包含一个布尔值

如果我有两张这样的桌子:

表1

Start | END |更多列。。。
------------------------------------------
2019-10-20 | 2019-10-21 |...      
表2

日志ID |日期
--------------
1 | 2019-10-20 
2 | 2019-10-22 
我尝试过使用CASE WHEN,Boolean,但我怀疑我的逻辑在某个地方是错误的

我想返回一个结果表,其中包含表1中的所有列,另外一列包含一个布尔值,即第二个表中是否存在该行范围内的日期

因此,结果集应该如下所示:

Start | End | MoreCols |可用
----------------------------------------------
2019-10-20 | 2019-10-21 |……|正确

使用
存在

select t1.*,
       (case when exists (select 1 
                          from table2 t2
                          where t2.date between t1.start and t1.end
                         )
             then 'True' else 'False'
         end) as available_flag
from table1 t1
如果数据库支持布尔类型,则可以将其编写为:

select t1.*,
       (exists (select 1 
                from table2 t2
                where t2.date between t1.start and t1.end
               )
       ) as available_flag
from table1 t1

他本应该起作用的。发布您尝试使用的存在和错误,以便我们可以帮助您调试。这是否回答了您的问题?你用的是什么产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的
postgresql
oracle
sql server
db2
,…我正在使用sql server的数据库产品添加一个。我的实际目标是,不是得到真正的值,而是将找到的日期输入到这个新列中。在我问了这个问题后,我突然想到了这一点。这个答案对我的逻辑有很大帮助。如果我想用找到的日期替换我的真实日期呢?@Karim。那么你会有一个完全不同的问题。例如,如果有多个匹配项,您想要什么日期?你应该问一个新问题来澄清。你是对的。因此,我应该指定,在我的DB中,不可能在同一日期有两个条目(因为它们链接到一个特定的候选ID,而该ID不能双重可用)。