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

问题描述

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

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')

enter image description here

解决方法

一个选项使用一系列联接来带动每个供应商的所有客户,然后进行汇总:

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子句可确保仅找到墨西哥。

,

类似这样的东西

;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;
,

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

获得结果