问题描述
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')
解决方法
一个选项使用一系列联接来带动每个供应商的所有客户,然后进行汇总:
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