排除满足特定条件的元素的查询
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
可能有更好的性能。请注意,如果需要,它也会返回没有产品的供应商。以上是关于排除满足特定条件的元素的查询的主要内容,如果未能解决你的问题,请参考以下文章
HIVE/Impala 查询:计算满足特定条件的行之间的行数