Строка отображается дважды в простом запросе

#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 . Внешнее соединение не требуется.