Внутреннее соединение только если удовлетворяет условие if


Я ищу анализ кода и оптимизация.

У меня есть две таблицы ItemCategory и ShopItemCategory

ItemCategory

--------------------------------------------------
| No | ItemCategoryId  |      CategoryName       |
--------------------------------------------------
| 1  |    1233         |      Cement             |
--------------------------------------------------
| 2  |    1200         |      Drinks             | 
--------------------------------------------------

ShopItemCategory

--------------------------------------------------
| No | ItemCategoryId  |        ShopId           |
--------------------------------------------------
| 1  |    1233         |           25            |
--------------------------------------------------
| 2  |    1200         |           32            | 
--------------------------------------------------

У меня есть SP (хранимую процедуру), чтобы получить ItemCategory список для выпадающего списка,

CREATE PROCEDURE [dbo].[spGetItemCategory]

AS
BEGIN

    SET NOCOUNT ON;

    SELECT ItemCategoryId ,CategoryName   
    FROM ItemCategory

End

Это один работает хорошо, и теперь у меня есть новое требование. Мне нужно отправить ShopId на СП и возврата ItemCategory список, который удовлетворяет условию, и если получающее shopid equals 0 тогда мне нужно вернуть все ItemCategory.

Мои СП :

CREATE PROCEDURE [dbo].[spGetItemCategory]
(               
    @ShopID INT
)

AS
BEGIN

     SET NOCOUNT ON;    

     if @ShopID <> 0
         BEGIN

              SELECT ItemCategory.ItemCategoryId,CategoryName   
              FROM ItemCategory 
              inner join ShopItemCategory on    
                     ShopItemCategory.ShopId = @ShopID AND  
                     ShopItemCategory.ItemCategoryId = ItemCategory.ItemCategoryId

          END
     else
     BEGIN

          SELECT  ItemCategoryId,CategoryName
          FROM aItemCategory

     END
 END

Это хорошо работает в моем коде. Но при двух условиях только inner join части разные, так есть ли способ, чтобы сократить код и повысить производительность?

У меня есть другие хранимые процедуры с большими кодами, если условия, поэтому этот метод будет делать это все больше и больше. Есть ли альтернативный способ сделать это? или для упрощения этого?



104
3
задан 6 февраля 2018 в 05:02 Источник Поделиться
Комментарии
1 ответ

Я сделал что-то подобное

CREATE PROCEDURE [dbo].[spGetItemCategory] (@ShopID INT)
AS
BEGIN
SET NOCOUNT ON;

SELECT ItemCategory.ItemCategoryID
,CategoryName
FROM ItemCategory
INNER JOIN ShopitemCategory ON (
ShopitemCategory.shopid = @ShopID
AND ShopitemCategory.itemcategoryid = ItemCategory.ItemCategoryID
)
OR (@ShopID = 0)
END

1
ответ дан 7 февраля 2018 в 07:02 Источник Поделиться