2011-03-03 51 views
1

我有一个查询返回多个记录,这些记录成对出现。记录对列中的一些信息与前面的ID和年份相同,但其他信息具有不同的值,前列名称类型可能为空,另一个为'A'。SQL帮助省略记录

如果第三列类型等于'A'或其中一个对的另一个任意字符串,我该如何去排除SQL查询的WHERE部分中具有相同ID和年份的记录?我在想一个案例陈述可能会被使用,但我不确定。

+0

是的,你可以使用大小写,并在最后过滤,如果你提供一些样本,我们可以给你更准确的答案 –

回答

1

您可以使用NOT EXISTS和子查询...

SELECT id, year 
FROM table t 
WHERE NOT EXISTS (SELECT * FROM table t2 
        WHERE ThirdColumn = 'A' 
        AND t2.id = t.id 
        AND t2.year = t.year) 
+0

,这将导致(2)表扫描,不是非常优化的解决方案 –

+0

可以有超过2相同的ID,比如说可以有8个,但每年只能返回2个,所以每年有2个相同的ID。如果我这样做,那么其他年份的所有其他ID也不会被退回,我怎么能在年份和ID都包括在内呢?我将需要将此语句移植到水晶语法,但现在只需获取SQL查询将启动我。 –

+0

@ K Ivanov - 如果他没有这些领域的索引,那么有更大的问题... – JNK

0

并非如此简单。

select t.* 
from tbl t 
left join (
    select t2.id, t2.year 
    from tbl t2 
    group by t2.id, t2.year 
    having count(*) > 1 and 
     count(case when type='A' then 1 end) * 
     count(case when type='A' then null else 1 end) > 0 
) X 
    on X.id = t.id and X.year = t.year 
WHERE X.id is null 
  • count(*) > 1有助于我们认为那里是至少具有相同ID的一对/年
  • 的2 count(case..) > 0■确定说,“type S的至少一个是‘A’,并在至少一个不
  • LEFT JOIN + WHERE IS NULL是一个典型的技术只显示在左连接失败的数据,即ID /符合子查询的条件,对年度取出