Внутреннее объединение с использованием оператора Case, поиск лучших вариантов - PullRequest
1 голос
/ 28 декабря 2011

Я пытался использовать оператор CASE, чтобы изменить условие соединения в зависимости от входных значений на сервере sql. У меня есть пример для объяснения этого, как показано ниже:

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 замедляют выполнение запроса.так что я здесь, если кто-нибудь может предложить мне лучшее решение ... кроме использования другого соединения ... как

select * from @child ch
inner join @parent p on p.prowid=ch.prowid
inner join @parent p2 on p.prowid=ch.prowid2

в ожидании ответа каждого ........

1 Ответ

3 голосов
/ 28 декабря 2011

Не будь умным, просто выбирай разные

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
...