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)
4

1 に答える 1

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

そして明らかに、顧客リストを絞り込むことができれば、昨年何も購入していない人を排除するのと同じように役立ちます.

于 2013-10-25T23:18:03.843 に答える