我是第一次与Oracle合作的SQL Server开发人员。我在UPDATE语句中遇到问题,我可以在SQL服务器中轻松构建。
假设我有一个表T1,其中包含KeyVal1,Keyval2,KeyVal3,NonKeyVal1,...... KeyVal1 2和3是复合键。
我也有表T2与T1的复合键有外键关系。如果记录存在于T2中,我想更新T1.NonKeyVal1和T1.NonKeyVal2。
在T-SQL中我会写:
Update T1
Set NonKeyVal1 = 'x',
NonKeyVal2 = 'y'
FROM T1
JOIN T2 ON T1.KeyVal1 = T2.KeyVal1 AND
T1.KeyVal2 = T2.KeyVal2 AND
T1.KeyVal3 = T2.KeyVal3;
但是我在Oracle SQL中无法解决这个问题。有人可以帮忙吗?
答案 0 :(得分:1)
试试这个
Update T1
Set NonKeyVal1 = 'x',
NonKeyVal2 = 'y'
FROM T1 WHERE EXISTS (
SELECT 1 FROM T2 WHERE T1.KeyVal1 = T2.KeyVal1 AND
T1.KeyVal2 = T2.KeyVal2 AND
T1.KeyVal3 = T2.KeyVal3);
答案 1 :(得分:1)
您需要将其写为相关子查询:
update t1
set nonkeyval1 = 'x'
where exists (select null
from t2
where t1.keyval1 = t2.keyval1
and t1.keyval2 = t2.keyval2
and t1.keyval3 = t3.keyval3);
答案 2 :(得分:1)
如果您根据加入某些列的T2中的值更新T1,那么在Oracle中,如果通过表上的约束保证连接列是唯一的,则可以编写可更新的视图。
因此,如果keyval1,keyval2和keyval3上有唯一或主键约束,您可以写...
Update (
select t1.NonKeyVal1 t1_NonKeyVal1,
t1.NonKeyVal2 t1_NonKeyVal2,
t2.NonKeyVal1 t2_NonKeyVal1,
t2.NonKeyVal2 t2_NonKeyVal2
from t1 join t2 on (
T1.KeyVal1 = T2.KeyVal1 AND
T1.KeyVal2 = T2.KeyVal2 AND
T1.KeyVal3 = T2.KeyVal3))
set t1_NonKeyVal1 = t2_NonKeyVal1,
t1_NonKeyVal2 = t2_NonKeyVal1;
你的案子可以更加简单:
Update (
select t1.NonKeyVal1,
t1.NonKeyVal2
from t1 join t2 on (
T1.KeyVal1 = T2.KeyVal1 AND
T1.KeyVal2 = T2.KeyVal2 AND
T1.KeyVal3 = T2.KeyVal3))
set NonKeyVal1 = 'x',
NonKeyVal2 = 'y';
如果没有约束,那么曾经有一个非官方的解决方法,它使用了一个未记录的优化器提示来绕过更新连接基数检查,但它并不是非常安全。
现在如果你没有约束,你可以使用MERGE语句,如果你需要引用连接表中的值,或者你的情况更简单,其他人建议的相关子查询就足够了。