#sql #sql-server #northwind
#sql #sql-сервер #northwind
Вопрос:
Одна строка повторяется дважды, и я не могу понять, почему. Я попытался использовать Group by, но тоже не смог этого понять, lol. Использование Left outer Join для перечисления поставщиков, у которых есть товар со скидкой, в базе данных Northwind
Select *
From Suppliers s
Left Outer Join products p
On s.SupplierID = p.SupplierID
Where p.Discontinued = 1
Комментарии:
1. Покажите нам несколько примеров данных, необработанных и после запроса, и ожидаемые результаты.
Ответ №1:
У вас есть два снятых с производства продукта для поставщика, и для каждой строки создается строка products
, соответствующая условию соединения и Discontinued = 1
предикату. Вы хотите что-то подобное:
SELECT * FROM Suppliers s
WHERE EXISTS (SELECT 1
FROM Products p
WHERE p.SupplierID = s.SupplierID
AND p.Discontinued = 1)
Ответ №2:
У вас есть две строки в одной из этих таблиц. Вы можете определить, какая из них запрашивает обе таблицы сами по себе для этого SupplierID .
Теперь, к вашему запросу, путем ввода p.discontinued в where , это соединение фактически становится внутренним соединением, поэтому вам следует либо перевернуть его во внутреннее соединение, либо переместить это условие в соединение.
Чтобы получить поставщиков с снятыми с производства продуктами, вы можете сделать это:
Select * from supplier where supplierId in (
select supplierId from products
where discontinued =1)
Ответ №3:
Очевидно, что у поставщика есть несколько снятых с производства продуктов.
Если вам нужны поставщики хотя бы с одним товаром со скидкой, используйте exists
:
select s.*
from suppliers s
where exists (select 1
from products p
where p.supplierid = s.supplierid and
p.Discontinued = 1
);
Если вам нужен список поставщиков с количеством снятых с производства продуктов, используйте join
:
select s.*, p.num_discontinued
from supplier s join
(select p.supplierid, count(*) as num_discontinued
from products
where p.Discontinued = 1
group by p.supplierid
) p
on p.SupplierID = s.SupplierID ;
Если вам нужен список продуктов, которые сняты с производства их поставщиками, используйте свой запрос, но измените значение left join
на an inner join
. Внешнее соединение не требуется.