У меня есть две таблицы, 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 Я пересчитана проблема для ясности, фактические имена таблиц и полей различны)
Мы на самом деле есть, но, к сожалению OrderItem записи обновляются повсюду, и мы не можем доверять ему. Мне нужно рассчитать его каждый раз на данный момент. – SSS
У вас может быть триггер в элементе заказа, чтобы обновить статус, но вам нужно быть осторожным в отношении производительности на нем. Еще одно предложение - добавить индекс на ** orderitem.delivery_id **, и это, скорее всего, сделает ваш запрос быстрее. – nozari
Я принимаю этот ответ. Это действительно не помогает моей конкретной проблеме, но это лучшее общее решение. – SSS