2012-02-03 112 views
0

我有一个包含的项目和类别ID表:距离 - SQL Server 2005中

create table SomeTable (
    ItemId int, 
    CategoryId int 
) 

鉴于一些类别ID(设置X)我想确定所有项目id该共享的至少一个类别ID和一些统计信息对于每个这些项id的:

A - 项目ID的类别ID不在集合的数x
乙 - 项ID和组之间共享类别ID数x
C - 集合x中类别标识的数目,但不相关随着项目编号

我已经写了一些tsql代码,其中涉及交叉连接和几个ctes加左连接。它有效,但相当缓慢。

我确定有人肯定遇到过类似的问题。我会提供代码,但上面的描述是简化的。谢谢。

+0

是2005年还是2008年? – 2012-02-03 09:54:45

+0

你如何通过Set X? – 2012-02-03 10:14:13

+0

对不起2005年,我通过nhibernate作为字符串传递它,所以我做的第一件事是确定字符串的类别ID。 – cs0815 2012-02-03 12:01:19

回答

1

这里有几个想法。 (我不知道他们会如何比较的性能明智的,你有什么了。留给你的标杆。)

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

与CTE的问题是,他们分别被引用的时间运行,并且没有限制。将您的Set X加载到ID为主键的临时表中。然后对临时运行相同的连接,你应该看到很大的性能提升。当连接基于主键时,SQL会更好。