SQL查询显示已在一个国家销售而不是另一个国家的产品

Posted

技术标签:

【中文标题】SQL查询显示已在一个国家销售而不是另一个国家的产品【英文标题】:SQL query to display products that have been sold in one country and not another 【发布时间】:2020-08-23 13:36:50 【问题描述】:

显示产品销往墨西哥而非西班牙的供应商名称

SELECT s.CompanyName 
FROM  OrderSupplier.Suppliers s
WHERE Country <> 'Spain' 
(SELECT p.Id 
FROM OrderSupplier.Suppliers s
JOIN OrderSupplier.Products p ON s.Id = p.SupplierId 
JOIN OrderSupplier.OrderItem oi ON p.Id = oi.ProductId 
JOIN OrderSupplier.Orders o ON oi.OrderId = o.Id 
JOIN OrderSupplier.Customers c ON o.CustomerId = c.Id
WHERE c.country = 'Mexico')

【问题讨论】:

您的问题是什么?你的尝试有什么问题? 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。 请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。 (这个问题应该全部是文字。) 【参考方案1】:

一个选项使用一系列连接来带来每个供应商的所有客户,然后聚合:

SELECT s.Id 
FROM OrderSupplier.Suppliers s
INNER JOIN OrderSupplier.Products p ON s.Id = p.SupplierId 
INNER JOIN OrderSupplier.OrderItem oi ON p.Id = oi.ProductId 
INNER JOIN OrderSupplier.Orders o ON oi.OrderId = o.Id 
INNER JOIN OrderSupplier.Customers c ON o.CustomerId = c.Id
WHERE c.country IN ('Mexico', 'Spain')
GROUP BY s.Id
HAVING MIN(c.country) = MAX(c.country) and MIN(c.country) = 'Mexico'

WHERE 子句过滤西班牙墨西哥的客户。然后HAVING 子句确保只找到墨西哥。

【讨论】:

您好。非常感谢您的回答!你能解释一下MIN和MAX的用法吗?我是 SQL 的新手,不太了解那部分 嘿,感谢您的意见,非常感谢。如果可以的话,你能删除你之前用我的名字发表的评论吗?因为这是一个大学作业,我不认为我应该在这里发帖....【参考方案2】:

类似的东西

;with
mex_cte as (
    select distinct s.id supplier_id
    from OrderSupplier.Suppliers s
         join OrderSupplier.Products p ON s.Id = p.SupplierId 
         JOIN OrderSupplier.OrderItem oi ON p.Id = oi.ProductId 
         JOIN OrderSupplier.Orders o ON oi.OrderId = o.Id 
         JOIN OrderSupplier.Customers c ON o.CustomerId = c.Id
    WHERE c.country = 'Mexico'),
sp_cte as (
    select distinct s.id supplier_id
    from OrderSupplier.Suppliers s
         join OrderSupplier.Products p ON s.Id = p.SupplierId 
         JOIN OrderSupplier.OrderItem oi ON p.Id = oi.ProductId 
         JOIN OrderSupplier.Orders o ON oi.OrderId = o.Id 
         JOIN OrderSupplier.Customers c ON o.CustomerId = c.Id
    WHERE c.country = 'Spain')
select * from mex_cte
except
select * from sp_cte;

【讨论】:

这个答案似乎比@GMB 的答案更容易理解,尽管从技术上讲,您不需要将每个 sql 放入 cte。出于性能原因,我也建议不要使用 distinct。 我其实更懂这个!如果没有 WITH 或 cte 你会怎么做呢?【参考方案3】:
SELECT 
P.ProductName, 
S.Country
FROM Products P
INNER JOIN Suppliers S on S.Id = P.SupplierId
where S.Country = 'USA'
and P.ProductName NOT IN
(
Select P.ProductName 
FROM Products P
INNER JOIN Suppliers S on S.Id = P.SupplierId
where S.Country = 'France'
)
Group by P.ProductName, S.Country

这将为您提供在美国而非法国销售的产品。

【讨论】:

【参考方案4】:

您应该提供示例数据和预期结果,但根据您提供的内容,您可以使用NOT EXISTS 实现结果

【讨论】:

我该怎么做? 提供样本数据或Fiddle

以上是关于SQL查询显示已在一个国家销售而不是另一个国家的产品的主要内容,如果未能解决你的问题,请参考以下文章

检查每个广告系列在一个国家/地区的销售状态是不是已更改,并将其分配给结果中每个广告系列的所有国家/地区

SQL子查询 - 显示所有运送产品的国家/地区

为什么索引显示图表而不是国家?使用Matplotlib水平条形图

根据列中的国家/地区名称插入国家/地区官方语言

Solr8.0.0搜索查询问题

在 WooCommerce 中显示完整的国家名称而不是国家代码?