我正在为“未售出的产品”制作存储过程。
以下是我到目前为止采用的方法的摘要。
注意:在生产中,将有最多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)
答案 0 :(得分:3)
我认为你做得对,但你可能会检查EXCEPT是否能给你带来更好的表现:
select C.CustID, P.ProdID
from @customers C
cross join @products P
EXCEPT
SELECT CustID, ProdID
from @sales S
group by CustID, ProdID
显然,如果你可以削减客户名单,这将有所帮助,就像去除去年没有购买任何东西的人一样。