2016-01-22 3 views
2

У меня есть следующая инструкция в хранимой процедуре, возвращающая странные результаты. Для двух столбцов, где один (RL) меньше 0, например -2, он должен добавить 2 к другому столбцу (HD). Если отрицательное значение было -8, оно должно добавить 8 в столбец HD.Ошибка соединения с сервером SQL

В тестовом только что закончившемся столбце RL было 0, а HD - 2. Я изменил RL на -2 и запустил код. Я был ОЖИДАЕТ: RL = 0 и HD = 4. Вместо этого РЕЗУЛЬТАТ был RL = 0 и HD = 5.

Я думаю, что проблема связана с наличием соединения. Как я могу написать это, чтобы заменить соединение предложением WHERE, пожалуйста.

UPDATE P 
SET P.HD = P.HD + P.RL 
    ,P.RL = 0 
FROM Products P 
INNER JOIN (
    SELECT id 
     ,RL 
    FROM Products 
    WHERE id IN (
      SELECT ProductID 
      FROM OrderDetails 
      WHERE OrderID = @OrderId 
      ) 
     AND RL < 0 
    ) Q ON P.ID = Q.id 

веселит

+0

Не добавлять "решить" в названии вопроса. StackOverflow уже знает, разрешен ли вопрос, если вы принимаете ответ. – Pablo

+0

Привет, извините, об этом не подозревал. Я думал, что не хочу тратить время других пользователей на вопрос, на который уже был дан ответ. Итак, как только ответ принят, угадывая вопрос «исчезает»? – Nick

+0

Это зависит от того, как вы выполняете поиск, например, он не появится на вкладке «Неизменные вопросы». – Pablo

ответ

2

Попробуйте один -

UPDATE Products 
SET HD = HD + RL, 
    RL = 0 
FROM P 
WHERE RL < 0 
    AND ID IN (
      SELECT ProductID 
      FROM dbo.OrderDetails 
      WHERE OrderID = @OrderId 
     ) 

Малый чек -

DECLARE @t TABLE (a INT, b INT) 

INSERT INTO @t (a, b) 
VALUES (1, 2) 

UPDATE @t 
SET a = b, b = 0 

SELECT * FROM @t 
+0

Genius! :) Спасибо Деварт. Это сработало. Итак, почему использование соединения делает его похожим на выполнение вычисления более одного раза? Я новичок в этом и все еще изучаю SQL – Nick

+0

Буду честно ... не знаю;) вы не предоставляете никакого образца «DDL» и данных, поэтому я просто предоставляю синтаксически правильный ответ, не перечитывая ... – Devart

+0

Для учебных целей просто проверьте эту книгу :) http://www.amazon.com/Microsoft-Server-Fundamentals-Developer-Reference/dp/0735658145/ref=asap_bc?ie=UTF8 – Devart

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