我有一个包含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”,其中:
和
我尝试过如下:
where order in (1,2,3) and date is null
但它返回id 2和id 1(我只期待id 2)。
感谢您的帮助。
答案 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
个记录值,其中1
,2
或3
值的所有订单都有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
答案 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")
并且可能会以不同的方式检查空日期。 order
和date
是SQL词,我在它们上使用引号。你应该避免使用这些名称。)
答案 4 :(得分:0)
很抱歉,上面没有一个解决了我的问题。
我使用“where not exists”解决了它(不包括不需要的)
谢谢大家的努力。