没有交叉连接的未售出产品查询?

时间:2013-10-25 21:29:18

标签: sql tsql sql-server-2008-r2 reporting cross-join

我正在为“未售出的产品”制作存储过程。

以下是我到目前为止采用的方法的摘要。

注意:在生产中,将有最多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)

1 个答案:

答案 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

显然,如果你可以削减客户名单,这将有所帮助,就像去除去年没有购买任何东西的人一样。