Хотя Томас действительно предлагает гораздо более простое решение, вернемся к исходному вопросу, ПОЧЕМУ он работает.
SELECT Pieces.Name, Providers.Name, Price
FROM Pieces INNER JOIN Provides ON Pieces.Code = Piece
INNER JOIN Providers ON Providers.Code = Provider
WHERE Price =
(
SELECT MAX(Price) FROM Provides
WHERE Piece = Pieces.Code
);
Во-первых, я ненавижу работать с коррелированными подзапросами, как в этом ответе. Коррелированный подзапрос - это тот, который подзапрос обрабатывается один раз для записи EACH. Обратите внимание, что внешняя часть запроса предоставляет ссылку на таблицу «Pieces». Поэтому внутренний запрос говорит из таблицы «PROVIDES», дайте мне максимальную цену для текущего значения «Pieces.code». После этого это простое соединение с другими таблицами, чтобы захватить детали и детали поставщика.
Мое личное предпочтение состоит в том, чтобы сделать предварительный агрегатный подзапрос ONCE в таблице «Обеспечивает» всеми кодами с собственной группой. Это запускает запрос один раз, сгруппированный, поэтому есть только одна запись для соответствующего кода. Чаще всего вы увидите такие запросы, чтобы предотвратить большие накладные расходы. Кроме того, хорошо работать с именами псевдонимов, особенно если вы имеете дело с использованием псевдонима.
from LongTableNamesInYourDatabase LTN
И всякий раз, когда вы работаете с несколькими таблицами, всегда стараемся обеспечить table.column или alias.column, так что другие пытаются помочь вам в будущем знать, где конкретный столбец из и не только гадать.
SELECT
P.Name,
Prov.Name,
MaxByPiece.MaxPrice
FROM
(SELECT
Pr1.Piece,
MAX(Pr1.Price) as MaxPrice
FROM
Provides Pr1
group by
Pr1.Piece) as MaxByPiece
JOIN Provides Pr2 on MaxByPiece.Piece = Pr2.Piece AND MaxByPiece.MaxPrice = Pr2.Price
JOIN Pieces P on Pr2.Piece = P.Code
JOIN Providers Prov on Pr2.Provider = Prov.Code
Это может выглядеть более сложным, но более применит, если у вас есть несколько таблиц с несколькими строками для данной вещи (договора, заказа, лиц, торгового представителя, что угодно), и в противном случае конца бы с декартовым результатом и задаются вопросом, почему дубликаты в подсчетах или итогах.
Первый запрос из предложения ничего не делает, кроме как получить максимальную цену за любую часть, и я использую псевдоним Pr1, чтобы отличить его от следующего соединения. Присоединение после этого - это предоставление, поэтому мы можем найти ВСЕ Пьесы по этой цене. Помните, что вопрос требовал ВСЕ ПРОГНОЗЫ по этой максимальной цене. Итак, теперь у меня есть записи, которые имеют максимальную цену за штуку и поставщика. Поэтому я заканчиваю, присоединяясь к тем таблицам поиска, чтобы получить имена
Вы можете подумать об этом, что у вас есть одна «группа» строк в подзапросе - все строки, удовлетворяющие условиям из предложения where. И это построено с использованием «коррелированного подзапроса», если вы хотите узнать название этого метода для исследовательских целей. – michaJlS
@michaJlS Спасибо, не знаю, это особый трюк. – Jacob