如何在Select语句中更新多行Order By Clause?

时间:2015-03-27 17:19:20

标签: oracle select sql-update sql-order-by oracle-sqldeveloper

我知道我们无法在更新声明中使用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

1 个答案:

答案 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