2015-10-28 2 views
0

У меня есть два разных варианта операторов обновления для хранимой процедуры. Верхняя часть не работает, а нижняя.Два разных оператора обновления - только один рабочий

Может ли кто-либо из вас предоставить представление о том, почему это не так?

UPDATE table1 
SET outcome = (
    SELECT outcome 
    FROM table2 
    WHERE table1.StatusID = table2.StatusID 
    AND table1.IDUser = table2.UserID 
) 

Ниже приведено ниже, хотя у меня есть те же ограничения.

UPDATE a 
SET a.outcome = b.outcome 
FROM table1 A 
INNER JOIN table2 B ON A.IDUser = B.UserID AND A.StatusID = B.StatusID 
+3

Не работает как? Нет обновлений, неправильных обновлений, ошибок и т. Д.? – jarlh

+0

Обновление не возвращает результаты; держит результат как NULL. Однако второй делает. – Paul

+0

В вашем втором заявлении нет 'SELECT' - может быть, проблема? – bunnmatt

ответ

-1
UPDATE table1 
SET outcome = (
    SELECT TOP(1)outcome 
    FROM table2 
    WHERE table2.StatusID = table1.StatusID 
    AND table2.IDUser = table1.IDUser 
) 
+1

Я не использую параметры. – Paul

3

Первое обновление потерпит неудачу, когда есть больше строк в table2 соответствующие соединения. Второе обновление выберет произвольное значение для результата из соединения и использует это значение в обновлении.

Это изменение первого обновления должны работать, или, вернее, дают один и тот же результат:

UPDATE table1 
SET outcome = (
    SELECT TOP 1 outcome 
    FROM table2 
    WHERE table1.StatusID = table2.StatusID 
    AND table1.IDUser = table2.UserID 
) 

Может быть, это будет лучше, чем существующие обновления. Таким образом, вы будете иметь некоторый контроль над которой значение будет в конечном итоге в исход в table1:

UPDATE table1 
SET outcome = (
    SELECT MAX(outcome) 
    FROM table2 
    WHERE table1.StatusID = table2.StatusID 
    AND table1.IDUser = table2.UserID 
) 
1

Это нормально, что первый запрос не работает так, как вы хотите, потому что это неправильный запрос.

Ваш первый код имеет основной запрос и дополнительный запрос. В вашем подзапросе вы присоединяетесь к таблицам и получаете набор результатов. Но в вашем основном запросе вы устанавливаете каждую строку с возвращенным результатом из подзапроса, так как у вас нет блока. В этом наборе результатов должно быть пустое значение. Это является причиной того, что у вас есть null после обновления.

Вы должны выполнить соединение из своего подзапроса, точно так же, как и во втором коде.

+0

Хорошо заметили, это проблема, когда между таблицами нет совпадений, таблица1 будет обновлена ​​до нуля –

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