2012-10-29 1 views
1

Я уже в течение нескольких часов путешествую в Google.SQL - найдите учетную запись, для которой все заказы завершены.

Две таблицы есть:

AccountTable 
ID | AccountID | OrderID 

OrderTable 
ID | OrderID | OrderStatus 

OrderStatus может иметь значения 1,2,3,4 с 4 Завершается статуса.

В таблице заказа добавляется несколько строк при обновлении статуса заказа. Итак, для выполненного заказа у вас будет 4 строки с 1, 2, 3 и 4 статусами соответственно, в OrderTable.

Отдельная учетная запись может иметь несколько заказов.

Я хочу найти учетные записи, для которых все заказы завершены.

я нашел до этого много:

select * from AccountTable 
INNER JOIN OrderTable 
ON AccountTable.OrderID = OrderTable.OrderID 
AND OrderTable.OrderStatus = 4 

Это будет забрать счета, для которых есть по крайней мере один порядок завершенного статуса.

Но это не будет охватывать сценарий, когда один заказ будет завершен, а другой заказ для той же учетной записи - нет. Тогда я не хочу выбирать учетную запись.

EDIT: Я просто хотел показать некоторые данные, чтобы сделать это более ясным:

AccountTable 
1 | Name1 | Order1 
2 | Name1 | Order2 
3 | Name2 | Order3 
4 | Name2 | Order4 

OrderTable 
1 | Order1 | 1 
2 | Order1 | 2 
3 | Order1 | 3 

4 | Order2 | 1 
5 | Order2 | 2 
6 | Order2 | 3 
7 | Order2 | 4 

8 | Order3 | 1 
9 | Order3 | 2 
10 | Order3 | 3 
11 | Order3 | 4 

12 | Order4 | 1 
13 | Order4 | 2 
14 | Order4 | 3 
15 | Order4 | 4 

Я хочу, чтобы получить только Имя2 и NOT name1.

+2

Похоже, что у одной учетной записи может быть только 1 заказ, однако такой же порядок может существовать для многих учетных записей. –

+0

Нет, одна учетная запись может иметь много заказов, и каждый заказ будет иметь самое большое 4 строки в таблице заказов – redDevil

+0

Oracle *** 9i ***?В самом деле? Это уже давно не поддерживается. –

ответ

1

Если предположить, что бизнес-логика не может быть поврежден, я думаю, что вы хотите, чтобы эти счета которого число заказов (статус == 4) такое же, как количество заказов, инициированных (состояние == 1):

SELECT AccountID 
    FROM (SELECT AccountTable.AccountID AS AccountID, 
       SUM(CASE OrderTable.OrderStatus WHEN 1 THEN 1 ELSE 0 END) AS o1, 
       SUM(CASE OrderTable.OrderStatus WHEN 4 THEN 1 ELSE 0 END) AS o4 
      FROM AccountTable 
      INNER JOIN 
       OrderTable 
       ON AccountTable.OrderID = OrderTable.OrderID 
     GROUP BY 1) d 
    WHERE o1 = o4; 

Вы можете РЕГИСТРИРУЙТЕСЬ оттуда, чтобы получить все поля из AccountTable.

Как в стороне, мне кажется, что ваши столы ошибочно названы. AccountTable является Account2Orders таблица, и OrderTable скорее OrderStagesOrLifeCycle стол.

+1

Сколько раз люди не понимают, насколько важно давать таблицы db или классы приложений подходящее имя !! – JotaBe

+0

Хмм .. это не настоящие имена таблиц, на самом деле они довольно длинные и скучные, я просто дал эти имена, чтобы сделать вопрос более ясным. thank u – redDevil

+0

thank u, это работает отлично! – redDevil

0

Нет соединения, подзапрос. Вы также не ищете копеллированный заказ - вы ищете учетную запись, у которой нет заказа, который не имеет статуса 4. То есть учетная запись, в которой заказ EXISTS, который НЕ имеет статуса 4.

Проверьте условие SQL Exists и группу для этого. ou попросит сначала получить запрос, который показывает заказы, которые не имеют статуса 4, тогда вы можете присоединиться к ним в таблице заказов.

0

отредактирован - понять ваши данные немного лучше:

Select 
    c.AccountID 
From (
    Select 
    a.AccountID, 
    o.OrderID, 
    Max(o.OrderStatus) As OrderState 
    From 
    AccountTable a 
     Inner Join 
    OrderTable o 
     On a.OrderID = o.OrderID 
    Group By 
    a.AccountID, 
    o.OrderID 
) c 
Group By 
    c.AccountID 
Having 
    Min(c.OrderState) = 4; 
+0

извините, но это все равно дает мне учетную запись, когда у меня есть один заказ, и другие не заполнены для этой учетной записи. – redDevil

 Смежные вопросы

  • Нет связанных вопросов^_^