查询排除满足特定条件的元素

时间:2019-05-12 13:43:48

标签: sql oracle join

我在尝试为我创建的这个简单数据库开发查询时遇到问题。它收集了由代码(CODICEFORNITORE)标识的3个供应商,该供应商销售电话或谷物等产品,每个供应商均由另一个代码(CODICEPRODOTTO)标识。我要完成的工作是找回不出售任何Apple产品的供应商数量。通过称为目录(CATALOGO)的第三张表,可以跟踪产品与其供应商之间的关联。

我认为最好的方法是在PRODUCT TABLE和CATALOG TABLE之间进行EQUI JOIN,然后尝试计算供应商销售的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 个答案:

答案 0 :(得分:1)

您可以使用以下方法获取至少提供一种产品而没有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'
                 );