Как подсчитать внешний ключ и использовать его для сортировки основной таблицы?

#sql #count #oracle-sqldeveloper

Вопрос:

У меня есть 2 стола:

  • Продукт (prod_id, prod_name, vend_id)
  • Поставщик (идентификатор поставщика, имя поставщика, состояние поставщика)

Я пытаюсь сделать запрос, который даст мне список vend_name для каждого поставщика, поставлявшего только один продукт. vend_id это внешний ключ Product , и я хотел бы подсчитать, сколько экземпляров каждого vend_id из Product них, а затем перечислить те vend_name , которые встречаются только один раз. Любая помощь будет признательна.

Я использую Oracle SQL Developer (потому что я должен).

Это то, что у меня есть, но продолжаю получать либо «недопустимый идентификатор», либо «групповая функция здесь запрещена».

 select count(*), Product.vend_id, Vendor.vend_id 
from Product 
inner join Vendor on Product.vend_id = vend.vend_id 
where count(*) < 2 
group by product.vend_id, vendor.vend_name;
 

Комментарии:

1. Я попробовал несколько предложений по аналогичным вопросам, но ни одно из них не является точным и не работает.

2. «Я использую oracle sql developer (потому что я должен)» звучит так негативно. Oracle-очень хорошая СУБД и довольно близка к текущему стандарту SQL, а их разработчик SQL-хороший инструмент. Так зачем же жаловаться?

Ответ №1:

Что — то вроде этого должно сработать:

 SELECT vend_name
  FROM Vendor
 WHERE vend_id IN (
        SELECT vend_id
          FROM Product
         GROUP BY vend_id
        HAVING COUNT(DISTINCT product_id) = 1
       )
;
 

Комментарии:

1. Большое вам спасибо, у меня было полтора года между введением в базу данных и расширенной базой данных, поэтому я совершенно забыл о вложенной инструкции select. Сработало как заклинание.

Ответ №2:

Если вы хотите выбрать поставщиков, у которых есть только один продукт, запрос аналогичен:

 select Vend_id, count(*) as Tot_Products
from Product 
group by Vend_id
having count(*) = 1
 

Я советую вам изучить функцию GROUP BY... HAVING , с помощью которой вы можете написать условие для столбца calcolata (например, результат a MAX, MIN и всех других функций), чтобы не использовать назойливый запрос, такой как:

 select *
from (select Vend_id, count(*) as Tot_Products
    from Product 
    group by Vend_id)
where Tot_Products = 1
 

Теперь у вас есть идентификатор для каждого поставщика, у которого есть только один продукт, теперь вы можете получить всю информацию о поставщиках, присоединившись к поставщикам, у вас есть что-то подобное:

 SELECT V.Vend_name
FROM (  select Vend_id 
        from Product 
        having count(*) = 1
        group by Vend_id )as P
inner join Vendors as V
    on p.Vend_id = V.Vend_id