SQL排除具有特定值的所有行?

时间:2015-05-19 15:10:07

标签: sql sql-server

我有一个包含这些值的表,这里有一个小样本

order   state   item id
10064315    ON  MCM1L162L116
10064315    ON  MCM1R162R116
10064315    ON  SHIPPING
10064316    MS  00801-1778
10064316    MS  SHIPPING
10064317    AZ  CHM110439-1
10064317    AZ  SHIPPING
10064318    TX  2607
10064318    TX  SHIPPING
10064319    MO  CHG8080
10064319    MO  SHIPPING
10064322    CA  W10001130

我想编写一个仅在没有SHIPPING的订单号上列出的sql查询,在此示例中,唯一没有SHIPPING的将是10064322。

我试着在这里找到但却找不到我要找的东西。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

一种选择是使用not exists

select ordernumber
from yourtable y
where not exists (
    select 1
    from yourtable y2
    where y.ordernumber = y2.ordernumber and y2.itemid = 'SHIPPING'
    )

答案 1 :(得分:2)

SELECT DISTINCT [order] 
FROM MYTABLE
WHERE [order] not in (SELECT [order] 
                      FROM MYTABLE 
                      WHERE [item id] = 'SHIPPING')

编辑:

根据Aaron Bertrand的文章(评论中的文章提示@TTeeple),这个问题的最佳表现(需要区别)如下:

SELECT [order]
FROM MYTABLE
  EXCEPT
SELECT [order]
FROM MYTABLE 
WHERE [item id] = 'SHIPPING'

完整文章 - > http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join

答案 2 :(得分:2)

使用条件聚合:

select [order] from
table
group by [order]
having sum(case when [item id] = 'SHIPPING' then 1 else 0 end) = 0