2015-02-09 5 views
0

Я новичок в разработке баз данных, и у меня есть хранимая процедура, где мне нужно делать некоторые INNER JOINs для таблиц только при условии выполнения условия. Ниже приведена более короткая версия моего сложного запроса.SQL Server - Добавить условное внутреннее соединение

IF (testFunction(@UserId)) = 0 
    select C.AwardId, C.ProgramName, Count(ClientId) as Intakes from Client C 
    where C.Id = @ClientId 
    group by C.AwardId, C.ProgramName... 
ELSE 
    select C.AwardId, C.ProgramName, Count(ClientId) as Intakes from Client C 
    INNER JOIN UserRoleEntity URE ON C.AwardId = URE.EntityId 
    INNER JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId 
     where C.Id = @ClientId 
     group by C.AwardId, C.ProgramName... 
END 

В основном, его же ВЫБРАТЬ запрос в обоих «IF» и «ELSE» за исключением того, что мне нужно сделать внутреннее соединение на 2 таблицы, когда условие IF не выполнено. Вместо того, чтобы повторять запрос как в «IF», ​​так и «ELSE», существует ли способ сделать его одним запросом, не переходя на динамический запрос?

Спасибо!

+0

Я предполагаю, что соединения выполняют дополнительную фильтрацию? –

ответ

0

Вы можете использовать дополнительные WHERE критерии и LEFT JOIN для фильтрации условно:

SELECT C.AwardId, C.ProgramName, Count(ClientId) as Intakes 
FROM Client C 
LEFT JOIN UserRoleEntity URE ON C.AwardId = URE.EntityId 
LEFT JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId 
WHERE C.Id = @ClientId 
AND ( testFunction(@UserId) = 0 
     OR (testFunction(@UserId) <> 0 AND URE.AwardID IS NOT NULL AND UR.ID IS NOT NULL)) 
GROUP BY C.AwardId, C.ProgramName 
+0

Отлично. Оно работает!! Спасибо огромное! Я только что изменил WHERE условие \t WHERE (функции теста (@UserId) = 0 \t \t \t \t \t ИЛИ (функции теста (@UserId) <> 0 и UR.CDPUserId = @UserId)). Я получаю те же результаты. Пожалуйста, дайте мне знать, если это неверно. –

+0

Я думаю, что это имеет смысл, я использовал 'IS NOT NULL', чтобы убедиться, что он фильтрует объединение записей, когда это' 0', но это может быть не нужно, если ваши результаты верны, то это важный бит. –

0

Если у вас есть вопрос правильно, вы хотите отобразить все поля, даже CDPUserID не существует или 0 не так ли? Вам просто нужно FULL JOIN в второй присоединиться:

SELECT C.AwardId, C.ProgramName, Count(ClientId) as Intakes FROM Client C 
INNER JOIN UserRoleEntity URE ON C.AwardId = URE.EntityId 
FULL JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId 
    WHERE C.Id = @ClientId 
    GROUP BY C.AwardId, C.ProgramName... 
+0

Где мое условие (testFunction (@UserId)) = 0 в любом месте этого запроса? –

0

Используйте OR и EXISTS() в где условия

select C.AwardId, C.ProgramName, Count(ClientId) as Intakes from Client C 
where 
    (testFunction(@UserId)) = 0 
    OR 
    (
     EXISTS 
     (
     SELECT * FROM UserRoleEntity URE INNER JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId 
     WHERE C.AwardId = URE.EntityId 
    ) 
     AND C.Id = @ClientId 
    ) 
group by C.AwardId, C.ProgramName... 
Смежные вопросы