Строка указана дважды в простом запросе - PullRequest
0 голосов
/ 15 апреля 2019

Один ряд повторяется дважды, и я не могу понять, почему. Я пытался использовать Group by, но не смог понять это, смеется. Использование Left external Join для перечисления поставщиков, у которых есть продукт со скидкой, в базе данных Northwind

Select *
From Suppliers s
  Left Outer Join products p
   On s.SupplierID = p.SupplierID
Where p.Discontinued = 1

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

У вас есть две строки в одной из этих таблиц. Вы можете определить, какие из них запрашивают обе таблицы по идентификатору поставщика.

Теперь, к вашему запросу, поместив p.discontinued в where, это соединение фактически становится внутренним соединением, поэтому вы должны либо перевернуть его во внутреннее соединение, либо переместить это условие в соединение.

Чтобы получить поставщиков с прекращенной продукцией, вы можете сделать это:

Select * from supplier where supplierId in (
   select supplierId from products 
   where discontinued =1)
1 голос
/ 15 апреля 2019

Очевидно, что у поставщика есть несколько снятых с производства продуктов.

Если вы хотите, чтобы поставщики имели хотя бы один продукт со скидкой, используйте 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 на inner join. Внешнее соединение не требуется.

1 голос
/ 15 апреля 2019

У вас есть два снятых с производства продукта для поставщика, и для каждой строки в products создается строка, соответствующая условию соединения и предикату Discontinued = 1. Вы хотите что-то подобное:

SELECT * FROM Suppliers s 
 WHERE EXISTS (SELECT 1
                 FROM Products p 
                WHERE p.SupplierID = s.SupplierID 
                  AND p.Discontinued = 1)
...