В чем разница между этими двумя версиями - PullRequest
1 голос
/ 20 июня 2020

В чем разница между 2 версиями, приведенными ниже ??

Suppliers(sid:integer, sname:string, address:string)
Parts(pid:integer, pname:string, color:string)
Catalog(sid:integer, pid:integer, cost:real)

Найдите идентификаторы поставщиков, которые поставляют красную или зеленую часть:

Версия 1 :

SELECT S.sid    
FROM Suppliers S, Parts P, Catalog C
WHERE S.sid = C.sid AND P.pid = C.pid AND (P.color = 'red' OR P.color = 'green')

Версия 2:

SELECT C.sid    
FROM Parts P, Catalog C
WHERE P.pid = C.pid AND (P.color = 'red' OR P.color = 'green')

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Второй запрос более эффективен, так как он не возвращает таблицу supplier (которая вам не нужна, поскольку вам нужен только поставщик sid, который можно найти в таблице parts).

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

select c.sid
from parts p
inner join catalog c on c.pid = p.pid
where p.color in ('red', 'green')
group by s.id

Обратите внимание, что в этой версии запроса используются стандартные явные соединения (с ключевым словом on), а не неявные соединения (с запятыми в предложении from): этот синтаксис, созданный десятилетиями go, значительно усложняет написание, чтение и обслуживание запроса, и его не следует использовать в новом коде.

0 голосов
/ 20 июня 2020

Это зависит от данных из выбранной вами таблицы. Если вы хотите выбрать sid из таблицы поставщиков, вы можете использовать первую версию. Или, если вы хотите из таблицы каталога, вы можете использовать вторую версию. Но в запросе нет необходимости использовать предложение OR. Вместо этого вы должны использовать предложение IN. Или должен использоваться только при фильтрации альтернативных условий из двух разных столбцов.

SELECT S.sid
FROM Suppliers S, Parts P, Catalog C
WHERE S.sid = C.sid AND P.pid = C.pid AND P.color IN ('red', 'green');
...