Получить идентификаторы, которые имеют одно конкретное значение, но не имеют другого конкретного значения - PullRequest
2 голосов
/ 11 октября 2011

У меня есть два столбца

OrderId  OrderStatus
120      1
120      2
121      1
123      1
123      2

Я хочу получить только строку с OrderId 121, потому что он имеет OrderStatus, равный 1, но не имеет OrderStatus, равный 2.

Ответы [ 3 ]

2 голосов
/ 11 октября 2011

Поскольку вы не упомянули о существовании 'StatusDate' или чего-то подобного, я возьму

Я хочу вернуть строку только с OrderId 121, потому что он имеетимел OrderStatus 1, НО ЭТО НИКОГДА НЕ БЫЛО OrderStatus 2. 2. 1005 *

, что означает

Я хочу вернуть только OrderId 121, потому что есть строка сOrderId 121 и OrderStatus 1, но нет строки с OrderId 121 и OrderStatus 2

В SQL 2005 и более поздних версиях EXCEPT делает это чрезвычайно кратким:

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

EXCEPT возвращает различные значения , поэтому больше нет необходимости в DISTINCT.

1 голос
/ 11 октября 2011

Вы можете использовать самостоятельное соединение, ища 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
0 голосов
/ 11 октября 2011

Если ваши статусы заказов равны только 1 и 2, и заказы должны иметь статус 1 в какой-то момент, прежде чем они станут статусом 2, вы можете искать заказы с максимальным значением статуса заказа 1:

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

Демо: http://www.sqlize.com/2k3C2SqMH2

Или, если не все так просто, мы можем быть более недвусмысленными в том, чтобы не допустить, чтобы когда-либо происходило состояние порядка 2, используя предложение not exists:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...