2011-12-28 52 views
1

我曾尝试使用CASE语句来改变依赖于SQL Server的输入值的连接条件,我有写例如这个如下内连接使用Case语句,寻找更好的选择

go 
declare @parentNumber int=0 
declare @parent table (prowid bigint,name varchar(200)); 
insert into @parent (prowid,name) values (1,'A'); 
insert into @parent (prowid,name) values (2,'B'); 

declare @child table(crowid bigint,prowid bigint,prowid2 bigint, name varchar(200)); 
insert into @child (crowid,prowid,prowid2,name) values (1,1,2,'AA_BA') 
insert into @child (crowid,prowid,prowid2,name) values (2,1,2,'AB_BB') 
insert into @child (crowid,prowid,prowid2,name) values (3,1,2,'AC_BC') 

--parentname will be of prowid 
select pr.name as ParentName,ch.* from @parent pr 
inner join @child ch on 
(CASE WHEN @parentNumber=0 THEN ch.prowid ELSE ch.prowid2 END)=pr.prowid 

SET @parentNumber=1 
--parentname will be of prowid2 
select pr.name as ParentName,ch.* from @parent pr 
inner join @child ch on 
(CASE WHEN @parentNumber=0 THEN ch.prowid ELSE ch.prowid2 END)=pr.prowid 

go 

解释我有表参数,所以你可以直接在你的查询窗口中运行,据我所知,case语句减慢查询执行。所以我在这里,如果任何人都可以建议我更好的解决办法......但是使用另一加入...像

​​

等待大家的回复........

+0

你的问题是什么? – 2011-12-28 09:51:07

+0

你只是在@parentNumber swicthing? – gbn 2011-12-28 09:53:55

+0

是否有任何其他方式来做到这一点,改变与输入参数的连接.. – 2011-12-28 09:54:44

回答

3

不要聪明,只是有不同的选择

IF @parentNumber=0 
    select pr.name as ParentName,ch.* from @parent pr 
    inner join @child ch on ch.prowid = pr.prowid 
ELSE 
    select pr.name as ParentName,ch.* from @parent pr 
    inner join @child ch on ch.prowid2 = pr.prowid 
+0

这只是示例示例,实际查询更大 – 2011-12-28 09:58:54

+3

@SamirTank:在这种情况下,这是为每个案件获得有效计划的最佳途径。一个“一般”计划将运行像狗屎 – gbn 2011-12-28 10:02:08

+0

我知道,这是关键,我想知道是否有更好的解决方案可以用来实现这一点.. – 2011-12-28 10:06:04