更新任何现有行

时间:2016-03-31 14:04:32

标签: sql oracle

我正在尝试更新CASE表中的所有行:

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)

我无法做到这一点,因为我不知道怎么写where where子句。它必须更新case.numer为空且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"

2 个答案:

答案 0 :(得分: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

但是因为我看不到你的桌子结构,我猜到你的桌子名称是[Case],如果我猜对了,这是不好的做法......

尝试一下,让我知道它是否有效

答案 1 :(得分:0)

在编辑中添加的第二个语句对Oracle无效,因为您无法加入更新(或删除)语句。因此,您需要一个子查询,正如您在第一个语句中尝试的那样。

但是在那个子查询尝试中,你没有正确关联;子查询中对CASE表的引用不应该存在,因为您可以引用update子句中的别名。然后,您可以在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检查有点多余。

('number'不是有效的列名;你在问题中使用'number'和'numer';替换你的实际列名.'case'对于表来说也不是一个好名字这是一个函数名称。)