2011-10-10 25 views

回答

2

因爲你不提有是一個「StatusDate」之類的東西,我要採取

我只想帶回一行的OrderId 121是因爲他們有一個OrderStatus 1但它從未有過OrderStatus的2

意味着

我只想帶回的OrderId 121,因爲沒有與121的OrderId和OrderStatus 1行,但沒有排機智^ h的OrderId 121和OrderStatus 2

隨着SQL 2005及更高版本,EXCEPT使得這個極其簡潔:

SELECT OrderId FROM [Order] WHERE OrderStatus = 1 
EXCEPT 
SELECT OrderId FROM [Order] WHERE OrderStatus = 2 

EXCEPT returns distinct values所以不需要任何進一步DISTINCT

0

的OrderStatus如果您的訂單狀態是隻有1和2,訂單必須成爲2狀態之前的某個點的狀態1,你可以搜索訂單,最大訂單狀態值爲1:

select distinct orderid from orders 
group by orderid 
    having max(orderstatus) = 1; 

演示:http://www.sqlize.com/2k3C2SqMH2

或者,如果它不是那麼簡單,我們可以更加明確不允許的2〜永遠都用not exists條款發生的orderstatus:

select distinct orderid 
    from orders o 
where not exists (
    select * from orders o2 
    where o2.orderid = o.orderid 
     and o2.orderstatus = 2 
    ); 

演示:http://www.sqlize.com/o6fSvWmvaj

1

您可以使用自聯接,從左邊的搜索OrderStatus = 1,錯過從右側與OrderStatus = 2加入:

declare @t table(OrderID int, OrderStatus int) 
insert into @t values (120, 1) 
insert into @t values (120, 2) 
insert into @t values (121, 1) 
insert into @t values (123, 1) 
insert into @t values (123, 2) 

select t1.* 
from @t 
    t1 left join 
    (select * from @t where OrderStatus = 2) as t2 on t2.OrderID = t1.OrderID 
where 
    t1.OrderStatus = 1 and 
    t2.OrderID is null 
相關問題