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查询显示已在一个国家销售而不是另一个国家的产品的主要内容,如果未能解决你的问题,请参考以下文章
检查每个广告系列在一个国家/地区的销售状态是不是已更改,并将其分配给结果中每个广告系列的所有国家/地区