sql multiple过滤组中的所有条件

时间:2018-03-21 14:04:14

标签: sql filter

我有一个包含3个字段的表:

id       order        date

1        1            null
1        2            not null
1        3            null
2        1            null
2        2            null
2        3            null
2        4            not null
3        1            null

我需要“id”,其中:

  • (1,2,3)
  • 中的所有“顺序”

  • 所有“日期”都为空(所以它是id 2)

我尝试过如下:

where order in (1,2,3) and date is null

但它返回id 2和id 1(我只期待id 2)。

感谢您的帮助。

5 个答案:

答案 0 :(得分:0)

还应包括ID 3。它满足你的条件。

SELECT distinct id
FROM tab1 aa
WHERE aa.order IN (1, 2, 3) AND aa.data IS NULL
      AND NOT exists(SELECT 1
                     FROM tab1 bb
                     WHERE ((bb.order IN (1, 2, 3) AND bb.data IS NOT NULL) 
OR
(bb.order NOT IN (1, 2, 3) AND bb.data IS NULL))
                           AND aa.id = bb.id);

如果你不想要ID 2,因为它在ID 4中有订单,那么请放松下一个条件:

bb.order NOT IN (1, 2, 3) 

没有检查日期。

如果有 (1,2,3)中的所有“顺序” 你的意思是应该有1的订单,2的订单和3的订单,那么你应该添加并存在于查询中以检查这一点,如

and exists (select 1 form tab1 cc where aa.id = cc.id and cc.order = 1 and cc.data is not null)

等等。

答案 1 :(得分:0)

如果我正确解释了您的问题,则以下SQL可以正常工作。

返回id个记录值,其中123值的所有订单都有null date 字段的值:

SELECT DISTINCT id
FROM t
WHERE
    order IN (1, 2, 3) AND
    date IS NULL AND
    id NOT IN (
        SELECT id
        FROM t
        WHERE
            order IN (1, 2, 3) AND
            date IS NOT NULL
    )

答案 2 :(得分:0)

我不确定你使用的数据库是什么,所以我试图找到一个最适用的查询。看看:

select * from
(select 
   id,
   SUM(case
      when [order] = 1 and [date] is  null then 1
      when [order] = 2 and [date] is  null then 1
      when [order] = 3 and [date] is  null then 1
      else 0
   end) score
from test
group by id) scores
where score = 3 

http://sqlfiddle.com/#!18/e4334/9

答案 3 :(得分:0)

您想要每个ID的结果,所以GROUP BY它。您只对第1,2和3阶段感兴趣,因此请使用WHERE子句。您只需要包含所有三个订单且未设置日期的ID。您可以在HAVING子句中聚合后进行检查。

select id
from mytable
where "order" in (1,2,3)
group by id
having count(*) = 3 -- all three IDs
and count("date") = 0; -- no non-null date

Rextester演示:http://rextester.com/SEE91944

(我推测表格的唯一键是id + order。否则你必须COUNT(DISTINCT "order")并且可能会以不同的方式检查空日期。 orderdate是SQL词,我在它们上使用引号。你应该避免使用这些名称。)

答案 4 :(得分:0)

很抱歉,上面没有一个解决了我的问题。

我使用“where not exists”解决了它(不包括不需要的)

谢谢大家的努力。