使用多个AND语句获取空结果集

时间:2014-04-10 19:19:28

标签: sql-server tsql sql-server-2012

我有一张包含fk,pk和日期的表格。每个外键都有许多带有日期的fk行。

我正在尝试选择具有多个日期的不同fk值。

SELECT DISTINCT table.fk
FROM table
WHERE table.date = 'date1'
   AND table.date = 'date2'
   AND table.date = 'date3'

它适用于一个日期,但是当我添加任何其他AND时,它不会返回任何结果。我知道我要求有多个日期的fks。

当我查看单个日期的查询计划时,它看起来不错,我有所有正确的索引,当我查看多个日期的查询计划时,它只显示“常量扫描”,这是查询成本的100%和一个0%的SELECT。

我也尝试使用相同的谓词选择pk,但我得到相同的空结果集。

3 个答案:

答案 0 :(得分:2)

当然,date不能同时为date1date2。我想你需要这个:

WHERE table.date = 'date1'
   OR table.date = 'date2'
   OR table.date = 'date3'

WHERE table.date IN ('date1', 'date2', 'date3')

答案 1 :(得分:1)

我认为这就是你所要求的 这将是具有所有三个日期(不是三个中的任何一个)的fk 这将包括具有所有三个日期的fk和具有所有三个日期和附加日期的fk。

select fk 
  from table 
 where date in ('date1','date2','date3') 
 group by fk  
having count(distinct(date)) = 3  

如果表中的pk是fk,date那么你可以使用count(*)

你也可以用连接或交叉来做,但这是最简单的(我认为)

A一次只评估一行的情况
Date = date1和Date = date2将始终为false(如果date1<> date2)

答案 2 :(得分:0)

如果您通过了不同的日期,则不可能匹配多次。

例如:

WHERE table.date = '20140410'
AND table.date = '20130410'
AND table.date = '20120410'

你无法达到这个条件。

使用table.date IN('date1','date2','date3')代替