这是“set-within-sets”查询。“set”是名称的所有行。“组内”是存在“2009”年,而其他年则不存在。
我首选的解决方法是使用group by
and having
,因为这是最通用的表述。以下是它对您的查询的工作方式:
select name
from t
group by name
having sum(case when year = 2009 then 1 else 0 end) > 0 and
sum(case when year > 2009 then 1 else 0 end) = 0;
该表达式sum(case when year = 2009 then 1 else 0 end)
计算给定名称的 2009 行数。仅当至少有一行 ( > 0
) 时,名称才会“通过”。第二个条件计算年份大于 2009 的行数。当没有这些时,名称通过= 0
。
编辑:
我喜欢这种方法的原因是因为灵活性。例如,如果您想要 2009 年和 2010 年,查询将是:
having sum(case when year = 2009 then 1 else 0 end) > 0 and
sum(case when year = 2010 then 1 else 0 end) > 0;
如果你想要 2009 年、2010 年而不是 2011 年:
having sum(case when year = 2009 then 1 else 0 end) > 0 and
sum(case when year = 2010 then 1 else 0 end) > 0 and
sum(case when year = 2011 then 1 else 0 end) = 0;
所有这些都具有基本相同的运行时间。