【问题标题】:Filter out rows returned in subquery过滤掉子查询中返回的行
【发布时间】:2012-11-09 03:04:45
【问题描述】:

我有一个存储汇总数据的临时表,我想创建一个查询,看看我是否可以稍微清理一下数据。我以为这很容易,但事实证明要困难得多。也许这很容易,而我只是走错了路。

我要做的只是删除 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' 的行。它完全忽略了“与”。这是我的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'
)

【问题讨论】:

    标签: sql subquery


    【解决方案1】:

    试试这个:

    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

    【讨论】:

    • 感谢 Lc.!那是快速响应并返回正是我需要的。现在我打算弄清楚为什么我的不起作用。 :-)
    • 它不起作用的原因是因为您没有将主查询与 NOT EXISTS 子查询相关联。由于表中某处存在满足您查询的一行,因此 EXISTS 对每一行都返回 True。
    • 啊,好的。谢谢你的解释。
    • 我刚刚意识到您的解决方案非常接近我的第一次尝试。我需要使用“OR”而不是“AND”,这对我来说似乎完全倒退了。
    • 是的,它需要一些思考才能意识到它应该是 OR,最简单的解释是你加入了两个否定的表达式。也就是说,(Item != 'TOTALS' OR count != 2) 等价于 NOT(Item == 'TOTALS' and count == 2)
    【解决方案2】:

    这对我有用:

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

    【讨论】:

    • 唐,起初我认为您的解决方案有效,但实际上删除了太多行。由于数据集较小,您可能没有看到它。
    猜你喜欢
    • 2014-03-31
    • 2016-01-16
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多