首页 > 解决方案 > 排除满足特定条件的元素的查询

问题描述

我在尝试为我创建的这个简单数据库开发查询时遇到了问题。它收集了 3 个由销售电话或谷物等产品的代码 (CODICEFORNITORE) 标识的供应商,每个供应商都由另一个代码 (CODICEPRODOTTO) 标识。我想要完成的是收回不销售任何 Apple 产品的供应商的数量。借助名为 Catalog (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”

桌子 提前感谢,抱歉英语不好

标签: sqloraclejoin

解决方案


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

推荐阅读