SQL Server - (AdventureWorks) Список поставщиков без продуктов - PullRequest
0 голосов
/ 02 октября 2018

Мне задали вопрос, используя AdventureWorks, чтобы перечислить всех поставщиков без продуктов.Когда я запускаю оператор SELECT, ничего не возвращается.Что я делаю неправильно?(Ответ может быть сделан только с помощью объединений и союзов - без подзапросов)

SELECT DISTINCT pv.Name AS 'Vendors'
FROM Purchasing.Vendor pv
INNER JOIN Purchasing.ProductVendor ppv
ON pv.BusinessEntityID = ppv.BusinessEntityID
INNER JOIN Production.Product pp
ON pp.ProductID = ppv.ProductID
WHERE pp.ProductID != ppv.ProductID;

Ответы [ 3 ]

0 голосов
/ 02 октября 2018
  • Используйте левое соединение, чтобы включить случаи, когда нет продукта для "продавца".Внутреннее объединение будет учитывать только те случаи, когда для поставщика существует идентификатор продукта.
  • Теперь выполните группировку по поставщику и посчитайте количество продуктов с помощью функции COUNT().
  • Наконец, отфильтруйте тех поставщиков, у которых количество равно нулю, используя HAVING предложение

Попробуйте следующее:

SELECT pv.Name AS 'Vendors', 
       Count(pp.ProductID) AS count_products 
FROM Purchasing.Vendor pv
LEFT JOIN Purchasing.ProductVendor ppv
ON pv.BusinessEntityID = ppv.BusinessEntityID
LEFT JOIN Production.Product pp
ON pp.ProductID = ppv.ProductID 
GROUP BY pv.Name 
HAVING count_products = 0;
0 голосов
/ 02 октября 2018

Вы просматриваете слишком много таблиц, у всех ProductVendors есть Продукты.Не у всех поставщиков есть ProductVendors.

Оттуда вы можете просто использовать LEFT JOIN и искать нулевые записи.

SELECT DISTINCT v.Name
FROM Purchasing.Vendor v
LEFT JOIN Purchasing.ProductVendor pv ON pv.BusinessEntityID = v.BusinessEntityID
WHERE pv.BusinessEntityID IS NULL
0 голосов
/ 02 октября 2018
SELECT DISTINCT pv.Name AS 'Vendors'
  FROM Purchasing.Vendor pv
  INNER JOIN Purchasing.ProductVendor ppv
     ON pv.BusinessEntityID = ppv.BusinessEntityID
  where not exists (SELECT 1 Production.Product pp  Where pp.ProductID = ppv.ProductID)

Вернуть всех продавцов, у которых нет продуктов

...