2015-10-12 5 views
-1

Это схема для базы данных:Нужна помощь в понимании запроса

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, потому что по какой-то причине я изо всех сил пытаюсь найти. ... хорошие ресурсы, чтобы действительно понять некоторые из этих основ по сравнению с другими языками программирования, и я постоянно заставляю людей голосовать, чтобы закрыть мои вопросы, но если бы кто-нибудь мог хотя бы сказать мне, как я могу лучше сформулировать свои вопросы или направить меня куда-нибудь лучше Поймите это, я был бы очень признателен.

ответ

1

У вас есть correlated subquery. Для каждой строки основного запроса подзапрос будет выполняться, поэтому подзапрос может ссылаться на основной запрос.

+0

С тех пор как меня спросили: «Для каждой части найдите окунь поставщика, который взимает наибольшую плату за эту часть», если слова «для каждой части» должны быть общим индикатором того, что это может быть коррелированный подзапрос? И если «для каждой части» также сообщит мне, что идентификатор частей - это то, что будет в основном запросе (поскольку вы сказали «для каждой строки в основном запросе, будет выполняться подзапрос», то есть для каждой части выполнить подзапрос)? @ESG – FrostyStraw

+1

Не обязательно. Тот же запрос может быть записан как соединение, или применить, или какой-либо другой вуду. Я бы не сказал слишком много смысла в формулировке. Скорее, попробуйте определить желаемый результат, а затем найдите лучший способ его выполнить. – ESG

2

Моей первой рекомендацией было бы НЕ пытаться думать о SQL как о языке программирования. Если вы начнете думать о циклах (за пределами, возможно, рекурсивного sql) или каких-либо утверждений (за пределами операторов Case), вы окажетесь в плохом месте. Вместо этого подумайте о наборах данных. «Эта часть запроса получает этот набор данных». SQL - это язык, который создает и работает с наборами данных.

Что касается этого вопроса, вы могли бы поставить в английском, как: «Дайте мне PID и SNAME продуктов и их высокая cost Кроме того, продукт должен быть в продукте, каталог и поставщика таблицы..»

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

Я добавил, но о продукте, который должен быть во всех трех таблицах, просто чтобы указать, что это использует неявный INNER JOIN. Я не большой поклонник неявной части этого и всегда предпочитаю, чтобы люди выписывали «INNER JOIN ON ...» в части запроса FROM. Неявный INNER JOIN - более старая школа.

Возвращаясь к размышлениям об этом в наборах данных. Представьте, что мы объединяем все три таблицы и возвращаем все поля. Каждый продукт, концептуально, может иметь более одной записи в наборе результатов с разными затратами, чтобы отличить одну запись от следующей.Поэтому мы добавляем подзапрос и ограничение, что стоимость в нашем наборе записей должна быть самой высокой стоимостью, которую мы можем найти для этого конкретного продукта (предложение подзапросов WHERE) в каталоге.

Смежные вопросы