Лично я предпочел бы утверждение 2. Моя причина сильно отличается от того, что вы ожидаете.
Вы поняли, что ваши 2 утверждения не созданы, чтобы возвращать одинаковые результаты?
Первый запрос NOT группирует записи по продуктам, группирует их по названию продукта. В большинстве БД столбцы с именем name
никогда не бывают уникальными. Следовательно, 2 GROUP BY
не эквивалентны (может быть, ваши тестовые данные получаются , чтобы сделать 2 одинаковых результата, но здесь играет только удача).
Вот что должно было быть написано:
SELECT
p.Name,
MIN (Price / Piece) AS MinPrice
FROM
[ORDER] o
JOIN
Product p ON IdProduct = p.Id
GROUP BY
IdProduct, p.Name /* GROUP BY PK on Product */
ИМХО, второй синтаксис - хорошая защита от такого рода ошибок. Я советую, это тот, который вы используете.
Это избавит вас от некоторых хлопот, когда вы будете работать с устаревшей БД с более 100 таблицами вместо двух таблиц, которые вы создали и заполнили самостоятельно, не говоря уже о том, что 1-й оператор может долгое время работать правильно, пока, наконец, Product.name
не перестанет работать. уникальный.
Кстати, неявный order by
намекал, что он не использует столбец PK. Это не замедляет ваш запрос. Это заказ записи в рамках подготовки к GROUP BY
PS: чтобы ответить на ваш вопрос о производительности, ваше второе утверждение против того, о котором я писал, должно быть очень похожим (спасибо планировщику запросов).
Я иногда видел, как 1-е утверждение было значительно медленнее, но никогда значительно быстрее 2-го (если существуют исключения, они достаточно редки, чтобы я их пропустил).
PPS: поскольку вы агрегируете данные из Product
, добавление WHERE
в поле из Order
может усложнить работу.
Боюсь, что именно такие вещи вы должны пробовать каждый раз, когда разрабатывается новый запрос.