我的桌子的例子
Name Code Jolas sd02 Jolas da014 Albert cca01 Albert da014 Julito sd02 Julito da014 Vergel cca01 Vergel da014
我要选择不带sd02的所有da014,因此我的输出应为Vergel和Albert,因为它们都没有SD02
我应该如何查询
谢谢
答案 0 :(得分:1)
您可以将GROUP BY
与HAVING
子句一起使用基于条件聚合的过滤条件:
SELECT Name
FROM your_table_name
GROUP BY Name
HAVING
SUM(Code = 'da014') AND /* Has code `da014` */
NOT SUM(Code = 'sd02') /* Does not have code sd02 */
答案 1 :(得分:0)
对于这些类型的问题,我通常更喜欢使用group by
方法。但是,如果性能是一个问题,那么使用正确的索引可能会更快:
select t.name
from t
where t.code = 'da014' and
not exists (select 1 from t t2 where t2.name = t.name and t2.code = 'sd02');
特别是,您希望在t(code, name)
和t(name, code)
上建立索引-一个用于外部查询,一个用于子查询。
如果您确实使用group by
,则在聚合之前进行过滤可以提高性能:
select t.name
from t
where t.code in ('da014', 'sd02')
group by t.name
having sum(t.code = 'sd02') = 0;
您只需要检查'sd02'
。如果不存在,则name
必须具有group by
要处理的其他代码。