我正在为“未售出的产品”开发一个存储过程。
以下是我迄今为止采用的方法的总结。
注意:生产中最多有 7 种产品,销售表中大约有 18,000 种相对于当前数量缓慢增长。
我的问题是:我是否可以考虑另一种方法来避免爆炸式交叉连接的潜在陷阱?
declare @products table (
productName varchar(50)
)
declare @customers table (
customerName varchar(50)
)
declare @sales table (
customerName varchar(50),
productName varchar(50)
)
insert into @products values ('Product1'), ('Product2')
insert into @customers values ('Customer1'), ('Customer2')
insert into @sales values
('Customer1', 'Product1')
,('Customer1', 'Product2')
,('Customer2', 'Product1')
-- want a row for each customer and each product they
-- have not been sold
select *
from @customers C
cross join @products P
where not exists(select productName
from @sales S
where S.customerName = C.customerName and
S.productName = P.productName)
最佳答案
我认为你做的是对的,但你可以检查 EXCEPT 是否给你更好的性能:
select C.CustID, P.ProdID
from @customers C
cross join @products P
EXCEPT
SELECT CustID, ProdID
from @sales S
group by CustID, ProdID
显然,如果您可以减少客户名单,那将会有所帮助,例如消除去年没有购买任何东西的人。
关于sql - 没有交叉连接的未售出产品查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19599720/