我正在尝试更新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"
答案 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'对于表来说也不是一个好名字这是一个函数名称。)