sql - 排除满足特定条件的元素的查询
问题描述
我在尝试为我创建的这个简单数据库开发查询时遇到了问题。它收集了 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”
提前感谢,抱歉英语不好
解决方案
您可以使用以下方式获取至少提供一种产品且没有 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'
);
推荐阅读
- python - 我应该将 XPath 与抓取代码分开吗?
- c# - c# 一维字节数组到二维双精度数组
- django - 使用 timezone.now() 获取本地时间
- javascript - 如何在 Vue.js 插槽中使用条件渲染?
- javascript - 如何从 React 中的父类更新我的子组件状态?
- flutter - 第 26 行 pos 14: 'url != null': 不正确
- javascript - 按钮未在 HTML 和 JavaScript 中单击
- sql - 我可以在 oracle 的一个联合子句中使用不同的提示吗
- c# - 如何让我流畅的第三人称动作不再抖动?
- node.js - Electron 应用程序渲染器进程在加载新的 html 页面时崩溃