我正试图为我正在编写的应用程序支持多个数据库。该应用程序主要使用Hibernate,但是当DML语句可以在很短的时间内处理它们时,迭代数百万行并单独处理它们的效率非常低。因此,对于某些操作,我需要制定SQL。我更像是一名MySQL人员,但迄今为止我的应用程序可以与SQL Server和MySQL一起工作。有一个操作让我难堪,我似乎无法弄清楚如何为Oracle构建一些更新查询。我知道,这可能是Oracle的一个新手问题,但我一直在寻找时错过了明显的答案......Oracle:通过其他表中的值更新表a中的列
下面是我如何为MySQL编写这种类型的查询:
更新table1的T1,T2表2设定t1.colA = t2.colA其中t1.colB = t2.colB和t1.colC = t2.colC
MySQL有一个很好的结构在那里你可以指定所有表在带有别名的'set'语句之前,这大大简化了声明的其余部分。在SQL Server中,我使用update ... join来做同样的事情。我试过使用'update table1 set colA =(select ....)where exists(select ....)syntax,但这不起作用 - 它返回一个'subquery returns多行'错误。我也尝试在句法上使用merge ... using ...,但是'无法从源表中获取稳定的一组行'的错误。
为了进一步解释我想要实现的目标,我有许多查询要执行,其中一些使用2个表,一些使用3个表。最复杂的需要这样做:
用tableC.colC中的值更新tableA.colB,其中tableA.colA = tableB.colA和tableB.colB = tableC.colB用于所有匹配的行。在数据方面,这看起来像这样(之前和之后):
Before:
Table A
-------
colA colB
1 NULL
2 NULL
3 NULL
4 NULL
Table B
-------
colA colB
1 A
2 A
3 B
4 B
Table C
-------
colB colC
A 15
B 20
After:
Table A
-------
colA colB
1 15
2 15
3 20
4 20
我希望这是足够清楚。任何人都可以解释如何为Oracle编写这种DML查询?对于奖励积分,PostgreSQL会一样吗? :)
是的,这不是我所追求的,因为子查询*将返回多于一行。我不想为每个不同的TableC.colC值运行更新。在Oracle和SQL Server中,我可以在单个DML操作中实现此目的。我想我说'更新TableA设置colB = TableC.colB *为每个案件*其中tableA.colA = tableB.colA和tableB.colB = tableC.colA'。 – 2010-09-30 10:57:25
@Mick Sear:子查询针对TableA中的每一行运行。如果它返回多个值,应该选择哪一个更新ColB? – Andomar 2010-09-30 11:01:46
好吧,我现在看到它,独立运行子查询后。非常感谢 – 2010-09-30 11:32:57