过滤掉子查询中返回的行

时间:2012-11-08 18:43:54

标签: sql subquery

我有一个存储汇总数据的临时表,并希望创建一个查询,看看我是否可以稍微清理一下数据。我认为这很容易但事实证明它要困难得多。也许这很容易,我只是把它接近一切都错了。

我要做的只是删除Item ='TOTALS'的行,但名称只显示两次。因此,在下表中,应删除第7行和第9行。你知道,没有钥匙。

姓名。项目...... Dlvrd
--------------------------
鲍勃102 .......... 18
鲍勃106 .......... 32
鲍勃108 .......... 34
鲍勃999 .......... 184
鲍勃..总计。 702个
约翰 。 64 ........... 86
约翰 。总计。 86个
吉姆...... 112 .......... 131
吉姆..总计.. 131
简。 10 .......... 720
简。 12 ........ 217个
简。 999 ........ 867
简。总计1848年

我的第一次尝试包括添加一个带有name列数的列,然后使用where子句,例如:where name!='2'和Item!='TOTALS'。没有工作,甚至把括号括在他们周围。它只删除任何一行2或其中Item ='TOTALS'。它完全忽略了'AND'。在这里我的sql:

select t.count, tr.*
From #TempRollup tr
join (
    select 
      Name
    , COUNT(Name) count
    from #TempRollup
    Group by Name
    ) as t on t.Name = tr.Name
where (
t.count != 2
and Item != 'TOTALS'
)

然后我尝试了这个方法,包括创建一个子查询来查找我想忽略的行,然后就是不选择它们。我的子查询抓取了正确的行但是当整个事件运行时,什么都没有返回。:

Select *
FROM #TempRollup
WHERE NOT EXISTS(  
    select tr.*
    From #TempRollup tr
    join (
            select 
              Name
            , COUNT(Name) count
            from #TempRollup
            Group by Name
            ) as t on t.Name = tr.Name
    where t.count = 2
    and Item = 'TOTALS'
)

2 个答案:

答案 0 :(得分:3)

试试这个:

SELECT t.*
FROM #TempRollup t
INNER JOIN
(
    SELECT Name, COUNT(*) cnt
    FROM #TempRollup
    GROUP BY Name
) counts ON t.Name = counts.Name
WHERE t.Item <> 'TOTALS' OR counts.cnt <> 2

SQL Fiddle example

答案 1 :(得分:1)

这对我有用:

select * from #TempRollup t
where 2 <> (select count(Name) from #TempRollup where Name = t.Name)
and Item <> ' TOTALS';