2015-04-28 2 views
-2

Я работаю над запросом, который я обновляю в пользовательской таблице, которая всегда имеет 1 строку (это часть гораздо большей операции). Эта таблица заполняется запросом из более крупной таблицы сотрудников на основе идентификатора сотрудника.Почему эти запросы возвращаются по-другому?

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

«Subquery вернулся более чем на 1 значение. Это недопустимо, когда подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение. '

погрешность.

Я не мог точно определить, почему, я пробовал заполнять значения с помощью выбора, и он возвращал только 1 результат.

Я был в недоумении, поэтому я попробовал ниже, и это сработало.

UPDATE @empInfo SET LastPromotionDate = ISNULL((
SELECT begindate 
FROM performanceyear 
WHERE (SELECT LastPromotionDate FROM @empinfo) BETWEEN begindate AND enddate 
AND [FK_Function_ID] = (SELECT FunctionID FROM @empinfo) 
AND Federal = (SELECT isFederal FROM @empinfo) 
), LastPromotionDate) 

Они определенно не выполняют одно и то же, но я чувствую, что здесь что-то не хватает. Почему один работает, а не другой? @empInfo имеет только одну строку.

Edit2:

Я, кажется, думал себя в угол на этом!

ОРИГИНАЛА запрос, который возвращается ошибка:

UPDATE @empInfo SET LastPromotionDate = 
ISNULL((
SELECT begindate 
FROM performanceyear 
WHERE LastPromotionDate BETWEEN begindate AND enddate 
AND performanceyear.[FK_Function_ID] = FunctionID 
AND Federal = performanceyear.Federal) 
,LastPromotionDate) 

@empInfo был столбец «Federal» и так же «performanceyear», когда я посмотрел в план исполнения этого, он сравнивал ' «Высокий уровень». Поэтому я изменил имя @empInfo Federal isFederal, и оно сработало.

Причина, по которой мой другой тест вызывал проблему, был не из-за двух строк в @empinfo. Это произошло потому, что я запускал обновление, а затем обновлялся снова. Первое обновление заставило второго вернуть 2 результата от performanceyear.

Выполняется независимо, они работают.

С этим все сказано, что я все еще не знаю решения, которое будет работать без столбцов, являющихся разными именами, поскольку я не могу использовать псевдоним @empInfo в подзапросе обновления.

+0

Добавлена ​​каретку возвращается с надеждой очистить запрос. –

+0

Намного лучше, спасибо. –

+0

Ошибка кажется довольно четкой. Один из ваших подзапросов возвращает более 1 значения, и вы не можете сравнить столбец с одним значением. Вы уверены, что @empinfo имеет только 1 строку - ошибка указывает на другое. –

ответ

0

Я подозреваю, что у вас есть несколько повторяющихся имен столбцов между @empInfo и performanceyear, и поскольку вы просто выбираете данные из одной таблицы, нет предупреждения. Если вы используете tablename.columnname, вы можете исправить свой первый запрос.

Я хотел бы переписать запрос следующим образом (непроверенные)

UPDATE ei 
    SET LastPromotionDate = ISNULL(py.begindate, py.LastPromotionDate) 
FROM performanceyear py 
INNER JOIN @empInfo ei 
    ON ei.LastPromotionDate BETWEEN py.begindate AND py.enddate 
     AND ei.FunctionID = py.[FK_Function_ID] 
     AND ei.isFederal = py.Federal 
+0

Так же, как я пишу свое обновление, вот в чем проблема: у меня был федеральный дважды в двух. –

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