2016-03-24 2 views
0

У меня есть хранимая процедура, которая выглядит следующим образом:обработка Результата в хранимой процедуре ЗЕЬЕСТЕ

 AS 
BEGIN 
    DECLARE @result nvarchar(max) 
    SELECT @result = COALESCE(@result + ', ', '') + ingredient.NAME 
     FROM MEAL 
LEFT JOIN MEAL meal ON MEAL.ID= ingredient.MEAL_ID 
     JOIN INGREDIENT ingredient ON ingredient.INGREDIENT_ID = problem_type.GID 
    where [email protected] 
RETURN @result 
END 

Трапеза может содержать ингредиенты (муку, мясо и т.д.). Допустим, что я не проверяю ингредиенты (проблема сложная, это пример), и что еда может содержать в виде ингредиентов муку, муку (2X) и мясо. Когда я хочу отобразить результат в приложении, эта хранимая процедура вернет строку «Мука, ​​мука, мясо». Я этого не сделаю, я хочу «Мука, ​​мясо».

Как это сделать в хранимой процедуре? Можно ли добавить инструкцию if в SELECT (?). В C#, например, я могу разделить строку и проверить, есть ли дубликаты, но возможно ли это в хранимых процедурах?

+0

Использование вложенного выбора .. в основном делают SELECT @result = COALESCE (@result + ',', '') + NAME из (выберите отдельный компонент.NAME ....), поэтому сначала хотите получить отчетность, а затем перейти с объединением – Veljko89

ответ

1

Один из способов заключается в использовании подзапросов, чтобы получить различные значения, а затем объединить их во внешнем запросе:

BEGIN 
    DECLARE @result nvarchar(max); 

    SELECT @result = COALESCE(@result + ', ', '') + i.NAME 
    FROM (SELECT DISTINCT i.NAME 
      FROM INGREDIENT i 
      WHERE i.MEAL_ID = @ID 
     ) i 
    RETURN @result 
END 

Примечание: я удалил оба JOIN с в запросе. У вас есть таблица MEAL дважды, что я считаю ошибкой - условия ON обречены на провал, а не определен. Что еще более важно, они не нужны, потому что INGREDIENT имеет MEAL_ID для статьи WHERE.

Кроме того, без дополнительных JOIN, вы можете обнаружить, что DISTINCT не требуется.

Смежные вопросы