#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