Это схема для базы данных:Нужна помощь в понимании запроса
Suppliers(sid:integer, sname:string, address:string)
Parts(pid:integer,pname:string,color:string)
Catalog(sid:integer,pid:integer,cost:real)
Цель: Для каждой части, найти SNAME поставщика, который заряжает наиболее для этой части.
код профессора:
SELECT P.pid, S.sname
FROM Parts P, Suppliers S, Catalog C
WHERE C.pid = P.pid AND C.sid = S.sid
AND C.cost = (SELECT MAX (C1.cost)
FROM Catalog C1
WHERE C1.pid = P.pid)
Сейчас, в общем я очень новой для SQL, так что я изо всех сил пытаются понять концептуально, как работают запросы. Если посмотреть на запрос выше, я смущен тем, как работает подзапрос. Я знаю, был ли подзапрос всего
SELECT MAX (C1.cost)
FROM Catalog C1
Он просто вернул бы максимальную стоимость в таблице Catalog. Но у этого есть условие WHERE C1.pid = P.pid
, и это - то, где мой ум перестает работать. Мы хотим максимальную стоимость для каждой части. Концептуально, как SQL-запрос знает, как посмотреть на каждый pid отдельно? Является ли добавление типа предложения WHERE сделать все вроде цикла (на обычном языке программирования)? Значит, он пойдет вниз по списку pids, найдет максимальную стоимость для каждого pid и вернет его для сравнения с C.cost, а затем перейдет к следующему pid? Или как это все происходит концептуально? (Что-то психически отсутствует в моем сознании, что помогает мне понять, КАК или КОГДА он проходит через каждый идентификатор)
В последнее время я задавал очень неопределенные вопросы о SQL, потому что по какой-то причине я изо всех сил пытаюсь найти. ... хорошие ресурсы, чтобы действительно понять некоторые из этих основ по сравнению с другими языками программирования, и я постоянно заставляю людей голосовать, чтобы закрыть мои вопросы, но если бы кто-нибудь мог хотя бы сказать мне, как я могу лучше сформулировать свои вопросы или направить меня куда-нибудь лучше Поймите это, я был бы очень признателен.
С тех пор как меня спросили: «Для каждой части найдите окунь поставщика, который взимает наибольшую плату за эту часть», если слова «для каждой части» должны быть общим индикатором того, что это может быть коррелированный подзапрос? И если «для каждой части» также сообщит мне, что идентификатор частей - это то, что будет в основном запросе (поскольку вы сказали «для каждой строки в основном запросе, будет выполняться подзапрос», то есть для каждой части выполнить подзапрос)? @ESG – FrostyStraw
Не обязательно. Тот же запрос может быть записан как соединение, или применить, или какой-либо другой вуду. Я бы не сказал слишком много смысла в формулировке. Скорее, попробуйте определить желаемый результат, а затем найдите лучший способ его выполнить. – ESG