OrderId OrderStatus
120 1
120 2
121 1
123 1
123 2
我想是因爲他們有1的OrderStatus用的OrderId 121只檢索行ID,但它確實沒有的2
OrderId OrderStatus
120 1
120 2
121 1
123 1
123 2
我想是因爲他們有1的OrderStatus用的OrderId 121只檢索行ID,但它確實沒有的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
。
的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
);
您可以使用自聯接,從左邊的搜索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