如何更新Select语句中的多行Order By子句



我知道我们不能在更新语句中使用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)

这里有更多的例子。

最新更新