我知道我们无法在更新声明中使用Order By Clause。但我的问题是我试图运行以下查询,我不知道为什么我收到错误消息。请帮我解决这个问题,以及Oracle中存在的确切目的是什么。 先谢谢你们。
更新cars2 set vehicle_number = Seq_vehiclenumber.nextval其中存在(按型号从CARS2中选择*);
错误消息: SQL错误:ORA-00907:缺少右括号 00907. 00000 - "错过右括号"
Desc cars2;
名称空类型
VEHICLEID NOT NULL NUMBER
BRAND NOT NULL VARCHAR2(30)
MODEL NOT NULL VARCHAR2(30)
VEHICLE_TYPE VARCHAR2(30)
FUEL_TYPE VARCHAR2(30)
TRANSMISSION_TYPE VARCHAR2(30)
GEARBOX NUMBER
DRIVE_TYPE VARCHAR2(30)
VEHICLE_NUMBER NUMBER
答案 0 :(得分:0)
您不需要序列来枚举已存在的行。您可以使用此update
枚举汽车:
update cars2 set vehicleid =
(select rn
from (
select row_number() over (order by model, brand) rn, model, brand
from cars2 order by model, brand ) temp
where temp.model = cars2.model and temp.brand = cars2.brand)
使用分析函数row_number()创建虚拟列rn
,处理订单model, brand
。
此rn
是用于按正确顺序枚举汽车的数字。
如果您有重复的对(型号,品牌),此更新将无效。
我不知道序列Seq_vehiclenumber
的目的是什么,如果您想稍后使用它来自动填充vehicleid,您必须创建触发器以将序列绑定到表。
但是这个序列不会对所有现有的行进行神奇的重新编号,只是按照正确的顺序排列select ... order by ...
至于你问题的这一部分“Oracle中存在的确切目的是什么” - exists
用于举例
当我们想选择有车的人时,就像这里:
select persons.id, persons.name
from persons
where exists (select * from cars where cars.owner_id = persons.id)
更多示例here。