Хранимая процедура - как игнорировать соединение, когда @packageType = 1 - PullRequest
0 голосов
/ 20 апреля 2019

Я хочу изменить левое соединение на внутреннее соединение, но для меня это сделать, Я хочу, чтобы соединение PACKAGEDETAILS.MenuID = MENU.ID происходило только в случае @packageType = 2, иначе я хочу, чтобы моя хранимая процедура игнорировала соединение

Я новичок в хранимых процедурах и SQL, я пытался использовать случай, когда, но я потерпел неудачу, я пытался, если тогда, все еще не достиг того, что я хотел.

set @slot = 5;
set @numberofattendees = 100;
set @foodtype = 0;
set @packagetype = 1;

select * FROM PROPERTY 

 JOIN PACKAGEDETAILS  ON  PACKAGEDETAILS.ID =

 (SELECT
   PACKAGEDETAILS.ID
  FROM
   PACKAGEDETAILS
`````````````````````````````````````````````````````
    LEFT JOIN MENU ON PACKAGEDETAILS.MenuID = MENU.ID AND  -- i want this join to happen only if the @packageType = 2
      MENU.IsActive = 1 AND
      MENU.IsDeleted = 0 AND
      (MENU.FoodTypeID = 0 OR @FoodType = 0)
`````````````````````````````````````````````````````
    JOIN PACKAGEAPPLICABILITY ON PACKAGEDETAILS.ID = PACKAGEAPPLICABILITY.packagedetailsid
  WHERE

    PACKAGEAPPLICABILITY.IsActive = 1 AND
    PACKAGEAPPLICABILITY.IsDeleted = 0 
  ORDER BY
    PACKAGEDETAILS.CostPrice ASC LIMIT 1
 )

Поскольку для packageType 1 меню не будет, я хочу, чтобы моя хранимая процедура игнорировала объединение, если @packageType = 1, и работала только при @packageType = 2.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Определите переменную и создайте свой запрос, установив переменную в соответствии с вашими условиями.При создании запроса выполните его с помощью команды exec.

Здесь является примером.

0 голосов
/ 20 апреля 2019

Вы пытаетесь упаковать 2 разных запроса в 1. В целом, это не очень хорошая идея в SQL, так как оптимизатор запросов работает намного сложнее.Вам лучше будет либо написать 2 отдельные процедуры, либо в рамках одной и той же процедуры написать 2 отдельных запроса и использовать условное выполнение IF, чтобы решить, какой запрос выполнить:

IF Packagetype = 2
select * FROM PROPERTY 
 JOIN PACKAGEDETAILS  ON  PACKAGEDETAILS.ID =
 (SELECT
   PACKAGEDETAILS.ID
  FROM
   PACKAGEDETAILS
`````````````````````````````````````````````````````
    LEFT JOIN MENU ON PACKAGEDETAILS.MenuID = MENU.ID AND  -- i want this join to happen only if the @packageType = 2
      MENU.IsActive = 1 AND
      MENU.IsDeleted = 0 AND
      (MENU.FoodTypeID = 0 OR @FoodType = 0)
`````````````````````````````````````````````````````
    JOIN PACKAGEAPPLICABILITY ON PACKAGEDETAILS.ID = PACKAGEAPPLICABILITY.packagedetailsid
  WHERE
    PACKAGEAPPLICABILITY.IsActive = 1 AND
    PACKAGEAPPLICABILITY.IsDeleted = 0 
  ORDER BY
    PACKAGEDETAILS.CostPrice ASC LIMIT 1
 )
ELSE
select * FROM PROPERTY 
 JOIN PACKAGEDETAILS  ON  PACKAGEDETAILS.ID =
 (SELECT
   PACKAGEDETAILS.ID
  FROM
   PACKAGEDETAILS
    JOIN PACKAGEAPPLICABILITY ON PACKAGEDETAILS.ID = PACKAGEAPPLICABILITY.packagedetailsid
  WHERE
    PACKAGEAPPLICABILITY.IsActive = 1 AND
    PACKAGEAPPLICABILITY.IsDeleted = 0 
  ORDER BY
    PACKAGEDETAILS.CostPrice ASC LIMIT 1
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...