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

Posted

技术标签:

【中文标题】排除满足特定条件的元素的查询【英文标题】:Query which excludes elements meeting a specific condition 【发布时间】:2019-05-12 13:43:47 【问题描述】:

我在尝试为我创建的这个简单数据库开发查询时遇到了问题。它收集了 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”

提前感谢,抱歉英语不好

【问题讨论】:

(显然)这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,有或没有您的特定字符串/名称,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 只需使用“sql ite:***.com”搜索您的标题即可返回答案。 How to exclude records with certain values in sql select的可能重复 请use text, not images/links, for text--including tables & ERDs. 解释或引用其他文本。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图片中包含图例/键和说明。 【参考方案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'
                 );

【讨论】:

哦,我不知道使用“CASE”子句的可能性。我会收集更多关于这方面的信息。子查询末尾的 c 是什么意思? NOT EXISTS 的解决方案工作正常。我也会尝试第一个。很抱歉没有提供有关属性名称的其他信息。快速更新:第一个也在工作(我最后删除了 c。) @KingPowa 。 . . NOT EXISTS 可能有更好的性能。请注意,如果需要,它也会返回没有产品的供应商。

以上是关于排除满足特定条件的元素的查询的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:查询以根据条件排除数据

HIVE/Impala 查询:计算满足特定条件的行之间的行数

如何使用 Mongoose 进行查询,获得 N 个结果,但结合它找到的任何满足特定条件的文档?

sql 2008 查询排除 某一列的数据

从与数组上的查询条件匹配的第一个元素中投影特定字段

架构师成长记_第八周_15_dsl搜索- 布尔查询