![](/img/trans.png)
[英]SQL- return a difference of number in a column in a table grouped by year (ORACLE)
[英]Update table column depending on other table in sql->oracle
这就是我到目前为止
BEGIN
UPDATE t1
set t1.LANGUAGE_ID = (case NETWORK.NID
when 11 then 10
else 7
end)
FROM PROFILE, NETWORK where
PROFILE.STATUS in ('A','U','S','H','I')
AND PROFILE.MID = t1.MID
AND NETWORK.MID = t1.MID
AND t1.IS_DELETED = 'N'
END;
出现错误:
"ORA-06550: line 7, column 21:
PL/SQL: ORA-00933: SQL command not properly ended
ORA-06550: line 2, column 18:
PL/SQL: SQL Statement ignored
ORA-06550: line 12, column 4:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
( begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted"
当t1.is_deleted ='N',并且配置文件中的中间状态为AUSHI时,我想更新t1。 所有表的中间都有一列。 任何想法,为什么我会收到此错误?
UPDATE
语句在Oracle中没有FROM
子句。
听起来您想要相关的更新
UPDATE t1
SET t1.language_id = (SELECT (CASE WHEN network.nid = 11
THEN 10
ELSE 7
END)
FROM profile,
network
WHERE profile.status IN ('A','U','S','H','I')
AND profile.mid = t1.mid
AND network.mid = t1.mid
AND t1.is_deleted = 'N');
如果相关子查询不返回任何行,这将更新t1
每一行并将language_id
设置为NULL
。 如果您只想更新t1
中有子查询返回的匹配行的行
UPDATE t1
SET t1.language_id = (SELECT (CASE WHEN network.nid = 11
THEN 10
ELSE 7
END)
FROM profile,
network
WHERE profile.status IN ('A','U','S','H','I')
AND profile.mid = t1.mid
AND network.mid = t1.mid
AND t1.is_deleted = 'N')
WHERE EXISTS( SELECT 1
FROM profile,
network
WHERE profile.status IN ('A','U','S','H','I')
AND profile.mid = t1.mid
AND network.mid = t1.mid
AND t1.is_deleted = 'N');
@Justin提供的解决方案效果很好,但是如果您的表很大,则可以考虑使用MERGE。 使用提供的查询,您将对表t1
每一行运行一次嵌套的SELECT查询。
我发现此链接非常有用: 8个批量更新方法比较
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.