我有一个包含这些值的表,这里有一个小样本
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。
我试着在这里找到但却找不到我要找的东西。
感谢您的帮助
答案 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