Подзапрос с предложением «Существует», где информация должна быть собрана из двух таблиц - PullRequest
0 голосов
/ 08 июля 2019

Итак, есть две таблицы. Один, где указана вся информация о продукте (ID, ProductName, SupplierID, UnitPrice, Package, IsDiscontinued), а другой - где хранится информация о поставщике (ID, CompanyName, ContactName, City, Country, ...) Мне нужно найти поставщиков с продукцией более 100 $. Поэтому приведенный код выглядит следующим образом:

SELECT CompanyName
FROM Supplier
WHERE EXISTS
( SELECT ProductName
FROM Product 
WHERE supplierID = supplier.ID
AND unitprice > 100);

Я не понимаю, почему в подзапросе нам нужно ВЫБРАТЬ ProductName, а не любое другое поле из таблицы Product? Кроме того, когда система обнаружила все названия продуктов с единичной ценой> 100 и сопоставлением идентификатора поставщика с другой таблицей, откуда она берёт название компании?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Я не понимаю, почему в подзапросе нам нужно ВЫБРАТЬ ProductName, а не любое другое поле

Вы можете выбрать любой другой столбец, даже все столбцы, даже константу, такую ​​как select 1...или даже null: select null....

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

когда система обнаружила все названия продуктов с unitprice> 100 и соответствием идентификатору поставщика с другой таблицей, откуда она собирала название компании?

утверждение:

SELECT CompanyName
FROM Supplier
................

поэтому название компании, конечно, собрано из таблицы Supplier тогда и только тогда, когда строка EXISTS в таблице Product с supplierID равно ID строки из таблицы Suppliers с дополнительным условием наличия unitprice > 100.

0 голосов
/ 08 июля 2019

На самом деле exists заботится только о том, возвращаются ли строки, а не значение в строке. Таким образом, не имеет значения, какие столбцы выбраны. Я обычно просто использую 1:

WHERE EXISTS (SELECT 1
              FROM Product
              WHERE supplierID = supplier.ID AND unitprice > 100
             )

1 легко набрать.

...