我知道我们不能在更新语句中使用Order By子句。但我的问题是,我正在尝试运行以下查询,我不确定为什么会收到错误消息。请帮我解决这个问题,以及Exists in Oracle的确切目的是什么。提前感谢各位。
update cars2 set vehicle_number=Seq_vehiclenumber.nextval where Exists(按车型从cars2订单中选择*);
错误消息:SQL错误:ORA-00907:缺少右括号00907.00000-"缺少右括号"
描述车辆2;
名称空类型
车辆编号不是空
品牌不为空VARCHAR2(30)
模型不为空VARCHAR2(30)
VEHICLE_TYPE VARCHAR2(30)
FUEL_TYPE VARCHAR2(30)
变速器类型VARCHAR2(30)
齿轮箱编号
DRIVE_TYPE VARCHAR2(30)
车辆编号
您不需要序列来枚举已经存在的行。您可以使用此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)
虚拟列rn
是使用解析函数row_number()创建的,该函数处理订单model, brand
。这个rn
是当时用来按正确顺序列举汽车的数字。
如果您有重复的配对(型号、品牌),此更新将不起作用。
我不知道序列Seq_vehiclenumber
的目的是什么,如果您稍后想使用它来自动填充车辆,您必须创建触发器来将序列绑定到表。但这个序列不会神奇地重新编号所有现有的行,只需select ... order by ...
就可以按正确的顺序排列
对于您问题的这一部分,"Exists in Oracle的确切目的是什么"-例如使用exists
当我们想选择有车的人时,比如这里:
select persons.id, persons.name
from persons
where exists (select * from cars where cars.owner_id = persons.id)
这里有更多的例子。