Запрос, который исключает элементы, удовлетворяющие определенному условию - PullRequest
0 голосов
/ 12 мая 2019

Я столкнулся с проблемой, пытаясь разработать запрос для этой простой базы данных, которую я создал. Он собирает 3 поставщиков, идентифицированных кодом (CODICEFORNITORE), который продает такие продукты, как телефон или зерновые, каждый из которых идентифицируется другим кодом (CODICEPRODOTTO). То, что я пытаюсь сделать, это вернуть количество поставщиков, которые не продают какой-либо продукт Apple. Связь между продуктами и их поставщиком отслеживается благодаря третьей таблице, называемой Каталогом (CATALOGO).

Я подумал, что лучший способ сделать это - EQUI JOIN между таблицей PRODUCT TABLE и CATALOG TABLE, затем попытаться подсчитать количество продуктов Apple, проданных поставщиками, а затем исключить те, чье количество меньше или равно 0 Но я не могу создать такой запрос. У меня нет проблем с подсчетом, сколько поставщиков продают продукты Apple.

Достигнуть обратного довольно просто (и я уверен, что смогу сделать это даже более простым способом):

SELECT COUNT(CODICEFORNITORE) AS NUMERO_FORNITORI_APPLE --- This the number of apple supplier
FROM CATALOGO C JOIN PRODOTTI P ON C.CODICEPRODOTTO = P.CODICEPRODOTTO
GROUP BY CODICEFORNITORE, MARCA
HAVING Marca = 'Apple';
--- this returns 1 as expected ---

То, что я пытаюсь достичь, должно вернуть '2' на основе следующей таблицы

table Заранее спасибо и извините за плохой английский

1 Ответ

1 голос
/ 12 мая 2019

Вы можете получить список поставщиков, которые поставляют хотя бы один продукт и не имеют продуктов Apple, используя:

SELECT CODICEFORNITORE
FROM CATALOGO C JOIN
     PRODOTTI P
     ON C.CODICEPRODOTTO = P.CODICEPRODOTTO
GROUP BY CODICEFORNITORE
HAVING SUM(CASE WHEN Marca = 'Apple' THEN 1 ELSE 0 END) = 0;

И вы можете получить количество, используя подзапрос:

SELECT COUNT(*)
FROM (SELECT CODICEFORNITORE
      FROM CATALOGO C JOIN
           PRODOTTI P
           ON C.CODICEPRODOTTO = P.CODICEPRODOTTO
      GROUP BY CODICEFORNITORE
      HAVING SUM(CASE WHEN Marca = 'Apple' THEN 1 ELSE 0 END) = 0
     ) c;

В качестве альтернативы, если у вас есть таблица поставщиков, вы можете использовать NOT EXISTS:

SELECT COUNT(*)
FROM FORNITORE F
WHERE NOT EXISTS (SELECT 1
                  FROM CATALOGO C JOIN
                       PRODOTTI P
                       ON C.CODICEPRODOTTO = P.CODICEPRODOTTO
                  WHERE F.CODICEFORNITORE = C.FORNITORE AND
                        P.Marca = 'Apple'
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...