2013-10-25 43 views
3

我正在處理「未售出產品」的存儲過程。未交叉連接的未售出產品查詢?

下面是我迄今採取的方法的總結。

注意:生產中最多會有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

有一張未售出的產品和已售出產品的表格。 – Laurence

+0

這很有趣...沒有想到這個 –

+0

但他需要每個客戶,不只是「沒有人購買這個項目」,而是「這傢伙還沒有購買這三個項目」。 –

回答

3

我覺得你這樣做是對的,但你可以看一看除非給你更好的性能:

select C.CustID, P.ProdID 
from @customers C 
cross join @products P 
EXCEPT 
SELECT CustID, ProdID 
from @sales S 
group by CustID, ProdID 

而且很明顯,如果你能削減下來的客戶名單,這將有助於像消除去年沒有購買任何東西的人。