2012-02-03 16 views
0

私はアイテムやカテゴリのIDを含むテーブルを持っている:の距離 - SQL Server 2005の

いくつかのカテゴリID(セットX)を考えると
create table SomeTable (
    ItemId int, 
    CategoryId int 
) 

私は、すべてのアイテムIDを決定したいと思います

A - アイテムIDのカテゴリIDのうち、セットxに含まれないアイテムの数。
B - アイテムIDとセットの間で共有されるカテゴリIDの数。B - アイテムIDとセットの間で共有されるカテゴリIDの数。 x
C - 集合x内のカテゴリIDの数。ただし、集合ではないアイテムIDとiatingされました

私は十字結合といくつかのcte +左結合を含むいくつかのtsqlコードを書いています。それは動作しますが、かなり遅いです。

誰かが同様の問題に遭遇したことを確認してください。私はコードを提供するだろうが、上記の記述は単純化されている。ありがとう。

+0

は2005年か2008年ですか? –

+0

セットXをどのように渡しますか? –

+0

sorry 2005と私は文字列としてnhibernate経由で渡すので、私が最初に行うことは、文字列からカテゴリIDを決定することです。 – cs0815

答えて

1

ここにいくつかのアイデアがあります。 (私は、彼らはあなたがすでに持っているもので賢明なパフォーマンスを比較するだろうかわからない。左をあなたのためのベンチマークに。)CTEの問題は、彼らが参照されるたびに実行されていないです

set nocount on; 

-- create a sample table 
declare @T table (ItemId int identity(1,1), CategoryId int); 
insert @T values (100); 
insert @T values (100); 
insert @T values (100); 
insert @T values (100); 
insert @T values (100); 
insert @T values (200); 
insert @T values (200); 
insert @T values (300); 
insert @T values (300); 
insert @T values (300); 
insert @T values (300); 
insert @T values (500); 
insert @T values (500); 
insert @T values (500); 
insert @T values (600); 
insert @T values (700); 
insert @T values (800); 
insert @T values (800); 
insert @T values (800); 
insert @T values (900); 


-- grab some CategoryIDs to work with 
declare @X table (CategoryId int); 
insert @X 
    select CategoryID=200 union 
    select CategoryID=400 union 
    select CategoryID=600 union 
    select CategoryID=800 


-- A. Number of category ids of item id that are not in set x 
select distinct t.CategoryID from @T t 
where not exists(select 1 from @X x where t.CategoryID = x.CategoryID) 

-- or, using the set difference operator 
select CategoryID from @T 
except 
select CategoryID from @X 


-- B. Number of category ids shared between item id and set x 
select distinct x.CategoryID from @X x 
join @T t on t.CategoryID = x.CategoryID; 

-- or, using set intersection 
select CategoryID from @T 
intersect 
select CategoryID from @X 


-- C. Number of category ids in set x but which are not associated with item id 
select distinct x.CategoryID from @X x 
where not exists(select 1 from @T t where t.CategoryID = x.CategoryID) 

-- or, using the set difference operator 
select CategoryID from @X 
except 
select CategoryID from @T 
1

制約。主キーon IDを持つテンポラリテーブルにSet Xをロードします。その後、一時的に同じジョインを実行すると、パフォーマンスが大幅に向上します。ジョインが主キーに基づいている場合、SQLの方がはるかに優れています。