2013-06-26 3 views
1

У меня есть две таблицы, Order и OrderItem. Существует взаимосвязь «один-ко-многим» на Order.Order_ID=OrderItem.Order_IDРасчетное поле резюме на основе детского стола

Я хочу, чтобы запрос возвращал список, показывающий статус каждого ордера, ПОЛНЫЙ или НЕПОЛНЫЙ.

ПОЛНЫЙ Заказ определяется как один, где все связанные записи OrderItem имеют значение NULL, непустое значение в поле OrderItem.Delivery_ID.

Это то, что я до сих пор:

SELECT Order.Order_ID, 'INCOMPLETE' AS Order_status 
    FROM Order 
    WHERE EXISTS 
    (SELECT * 
    FROM OrderItem 
    WHERE OrderItem.Order_ID=Order.Order_ID 
    AND (OrderItem.Delivery_ID IS NULL OR OrderItem.Delivery_ID='')) 
UNION 
    SELECT Order.Order_ID, 'COMPLETE' AS Order_status 
    FROM Order 
    WHERE NOT EXISTS 
    (SELECT * 
    FROM OrderItem 
    WHERE OrderItem.Order_ID=Order.Order_ID 
    AND (OrderItem.Delivery_ID IS NULL OR OrderItem.Delivery_ID='')) 
ORDER BY Order_ID DESC 

Он работает, но работает немного медленно. Есть ли способ лучше?

(NB Я пересчитана проблема для ясности, фактические имена таблиц и полей различны)

ответ

1

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

Это упростит ваш запрос, чтобы получить статус, а также повысить производительность.

+0

Мы на самом деле есть, но, к сожалению OrderItem записи обновляются повсюду, и мы не можем доверять ему. Мне нужно рассчитать его каждый раз на данный момент. – SSS

+1

У вас может быть триггер в элементе заказа, чтобы обновить статус, но вам нужно быть осторожным в отношении производительности на нем. Еще одно предложение - добавить индекс на ** orderitem.delivery_id **, и это, скорее всего, сделает ваш запрос быстрее. – nozari

+0

Я принимаю этот ответ. Это действительно не помогает моей конкретной проблеме, но это лучшее общее решение. – SSS

1

Поместите его в подзапрос, чтобы попытаться сделать сазе менее запутанным:

SELECT Order_ID, 
     CASE WHEN incomplete_count > 0 THEN 'INCOMPLETE' ELSE 'COMPLETE' END 
      AS Order_status 

    FROM (SELECT o.Order_ID 
       ,SUM(CASE WHEN OrderItem.Delivery_ID IS NULL OR OrderItem.Delivery_ID='' THEN 1 ELSE 0 END) 
       AS incomplete_count 
      FROM Order o 
      INNER JOIN OrderItem i ON (i.Order_ID = o.Order_ID) 
      GROUP by o.Order_ID 
     ) x 

    ORDER BY ORder_ID DESC 

Идея заключается в том, чтобы сохранить счетчик каждый раз, когда вы сталкиваетесь с нулевым элементом. Если сумма равна 0, элементов пустого порядка не было.

1

Попробуйте один -

SELECT 
     o.Order_ID 
    , Order_status = 
       CASE WHEN ot.Order_ID IS NULL 
        THEN 'COMPLETE' 
        ELSE 'INCOMPLETE' 
       END 
FROM dbo.[Order] o 
LEFT JOIN (
    SELECT DISTINCT ot.Order_ID 
    FROM dbo.OrderItem ot 
    WHERE ISNULL(ot.Delivery_ID, '') = '' 
) ot ON ot.Order_ID = o.Order_ID