2009-07-30 2 views
0

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

Запрос:

UPDATE @Table1 SET D = t2.D + t3.D 
FROM @Table1 t1 
INNER JOIN @Table2 t2 ON 
    t1.P = t2.P 
INNER JOIN @Table3 t3 ON 
    t1.A = t3.A 
+0

Написание точного запроса поможет вам понять вашу проблему и предоставить альтернативные решения. – Dheer

+0

Можете ли вы предоставить хотя бы свою платформу? Исправления для этого будут значительно отличаться от этого. – Eric

+0

Скажите, пожалуйста, какой DB и дать нам фрагмент кода для работы с. – lexu

ответ

0

Я не знаю, о Oracle, но я знаю, что в SQL-сервер не может передать имена таблиц в качестве параметров, если вы не готовы динамически создать строку SQL и EXEC().

Надеюсь, пользователь Oracle может подтвердить, может ли Oracle сделать что-то подобное.

0

Вы должны использовать псевдоним для @ Table1 в предложении UPDATE - это может быть даже вашей проблемой. Как это:

UPDATE t1 SET D = t2.D + t3.D 
FROM @Table1 t1 
INNER JOIN @Table2 t2 ON 
    t1.P = t2.P 
INNER JOIN @Table3 t3 ON 
    t1.A = t3.A 

Это будет гораздо более стабильным, так как она поймет, что вы не считая его отдельной таблицы в предложении FROM.

На самом деле, действительно хорошая практика использовать псевдонимы только в предложении UPDATE, когда у вас есть предложение FROM.

Роб

2

В Oracle можно заключить запросы, которые возвращают только одну строку (скалярных подзапросов) в круглых скобках и использовать их, как вы будете использовать переменные/столбцы:

UPDATE Table1 t1 
SET D = (SELECT t2.D + t3.D 
     FROM Table2 t2 
      ,Table3 t3 
     WHERE t1.P = t2.P 
      AND t1.A = t3.A); 

Если подзапрос возвращает более в одной строке вы, вероятно, захотите использовать SUM() в подзапросе. Редактирование: Если вы не присоединяете таблицы в подзапросе, вы, вероятно, должны использовать вместо этого два подзапроса.

UPDATE Table1 t1 
SET D = (SELECT sum(t2.D) 
     FROM Table2 t2 
     WHERE t1.P = t2.P) 
     + 
     (SELECT sum(t3.D) 
     FROM Table3 t3 
     WHEREt1.A = t3.A) 
+0

Можете ли вы объяснить, что такое использование суммы? – Prem

+0

SUM гарантирует, что вы получите ровно одну строку. – jva

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