Что делает этот запрос?

0

У меня есть следующие таблицы:

PRODUCT ( ProdId, Name, Price, Weight, Category, Description, … )
DETAIL ( OrdId, ProdId, Qty, … )
ORDER ( OrdId, ClientId, Amount, OrdDate, DeliveryDate, ChosenStoreId, … )

и я должен описать простыми словами (т.е. не программисту), что делает следующий запрос:

select * from Order O
where Amount < 0.95 * ( select sum( Qty * Price ) from Product natural join Detail
where OrderId = O.OrderId )

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

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

Может кто-нибудь сказать мне, что делает запрос? Заранее спасибо.

Примечание: кроме таблиц, это вся необходимая информация для запроса.

Теги:
database

2 ответа

0

Я не одобряю natural join, но это отдельная проблема.

Возвращаются строки, в которых amount заказа составляет менее 95% от суммы цен товаров в заказе.

Причина разницы неясна - это может быть связано со скидками на уровне order; это может быть связано с дополнительными расходами, такими как налоги или доставка; или могут быть и другие причины.

0

Re Гордон Я также не одобряю natural join. Запрос кажется намеренно загадочным, тем более что нет примеров данных. Хорошая стратегия - написать SQL в более общем синтаксисе и сделать вывод, см. Ниже:

select o.OrdId,
       sum(o.Amount) Amount,
       sum(d.Qty * p.Price) QtyPrice

from Order as o
  left join Detail as d on d.OrdId = o.OrdId
  left join Product as p on p.ProdId = d.ProdId

group by o.OrdId

having sum(o.amount) < (0.95 * sum(d.Qty * p.Price))

Мне этот запрос возвращает

  1. Все уникальные заказы, сделанные в системе
  2. Если сумма заказа была меньше, чем 95% от ожидаемой суммы.

Как вы сказали, это может быть трекер скидок или, возможно, поле o.Amount заполняется независимо от таблиц Detail и Product.

  • 0
    Здравствуйте, спасибо за ответ. Не могли бы вы сказать мне, почему естественные соединения не годятся?
  • 1
    Читаемость является основной причиной. Может быть, вы хотите включить только совпадающие записи, используя inner join . Или, возможно, вам нужно видеть null значения между двумя таблицами, поэтому вы используете left join . Объединения огромны, и их использование сильно влияет на вывод запроса. Использование таких natural join масок natural join которые затрудняют отладку кода для вас и других.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню