2016-03-31 2 views
0

Я пытаюсь обновить все строки в моем случае таблицы:обновить любую существующую строку

UPDATE CASE c 
SET c.number = 
(
select p.number 
from CASE c, Papers p, Dokument d 
where c.dokument = d.id 
and p.id = d.paperid 
and p.numer is not null 
and c.case = null; 
) 
where 
(this same as in set : when case.number is null but papers.numer is not null) 

Я не могу этого сделать, потому что я не знаю, как писать ИНЕКЕ. Он должен обновлять все строки, где case.numer имеет значение null, а papers.number не равно нулю.

Как это можно написать? Могу ли я написать цикл? Я никогда не использовал PL/SQL, поэтому я не знаю, как это сделать.

Я также пытался обновить, как это, но получил сообщение об ошибке:

UPDATE s 
SET s.number = w.number 
FROM CASE s 
JOIN Dokument d on d.CASEID =s.ID 
JOIN Paper w on w.DOKUMENTID =d.ID and w.number is NOT NULL 
WHERE s.number IS NULL 
AND s.secondNumber IS NULL 
AND s.FIRSTNAME = w.FIRSTNAME 
AND s.SURNAME = w.SURNAME; 

SQL Error: ORA-00933: polecenie SQL niepoprawnie zakończone 
00933. 00000 - "SQL command not properly ended" 
+4

tsql или Oracle? Не вижу, чтобы вы использовали их вместе. – jarlh

+0

На основании комментария в последнем предложении я удалил тег Oracle. –

+0

Просьба указать, какие СУБД вы используете. Теперь вы добавили тег PL/SQL, который подходит для Oracle, а не SQL Server. Это важно. –

ответ

3

Это так, как я хотел бы сделать это в T-SQL ....

update c 
set c.number = p.number 
from [CASE] c 
join [Dokument] d on c.dokument = d.id 
join [Papers] p on p.id = d.paperid and p.number is not null 
where c.number is null 

Но потому что я не вижу вашей структуры таблицы, я догадывался, почему почему-то ваше имя таблицы - это [Дело], плохая практика, если я догадался, что это правильно ...

Дайте ему попробовать и дайте мне знать, если это работает

+0

Спасибо, можете ли вы сказать, обновляет ли он все строки или только первую строку, отвечающую этим условиям? – jan345

+0

Он обновляет всю строку, удовлетворяющую условию where ... в этом случае все строки с номером null в таблице [Case] ​​... но проверьте его – Veljko89

+0

Спасибо, что я вышел из своего рабочего компьютера, но завтра я скажу вы, если все это работает – jan345

0

Ваше второе утверждение, добавленное в редактировании, недействительно для Oracle, поскольку вы не можете присоединиться к оператору обновления (или удаления). Поэтому вам нужен подзапрос, как вы пытались в своем первом заявлении.

Но в этой попытке подзапроса вы не коррелируете должным образом; ссылка на таблицу CASE в подзапросе не должна быть там, так как вы можете ссылаться на псевдоним из предложения обновления. И вы можете сделать то же запрос в exists пункте, чтобы решить, что обновление:

update case c 
set c.number = 
(
select p.number 
from papers p 
join dokument d 
on d.paperid = p.id 
where c.dokument = d.id 
and p.number is not null 
) 
where c.number is null 
and exists (
select p.number 
from papers p 
join dokument d 
on d.paperid = p.id 
where c.dokument = d.id 
and p.number is not null 
); 

Это предполагает, что будет только (по большей части), согласующийся p.number, который не может быть. Если их может быть больше одного, вам нужно выбрать способ использования - с max/min, некоторыми критериями заказа и т. Д. Использование агрегата сделает ошибку p.number is not null немного избыточной.

(«номер» не является допустимым именем столбца, вы использовали «номер» и «число» в вопросе, замените свое фактическое имя столбца. «Case» также не является хорошим именем для таблицы так как это имя функции).