在Oracle中使用Alias时如何解决错误

时间:2019-06-26 15:38:12

标签: sql oracle

运行以下代码时收到语法错误

42601:“。”或附近的语法错误。

我认为这与别名有关,但是我看不出问题出在哪里。

SELECT * FROM (
SELECT 
m.shipment_id
m.route_id,
m.leg_sequence_id,
m.leg_warehouse_id,
m.leg_ship_method,
row_number() over (partition by m.route_id order by m.leg_sequence_id desc) as rn
FROM posimorders.sc_execution_eu.o_detailed_routes_v2 m
) 
WHERE rn=1
LIMIT 100;

1 个答案:

答案 0 :(得分:2)

您的代码包括:

SELECT * FROM (
SELECT 
m.shipment_id
m.route_id,
...

m.shipment_id后缺少逗号,因此它试图将m.route_id解释为货件ID的列别名,这不是您想要的;别名是单个标识符,而不是点分隔的层次结构。因此,您看到的错误虽然不是来自Oracle本身-您的客户端似乎首先在解析它。

Oracle还不支持LIMIT,但是从12c开始它具有a row-limiting clause,您可以改用:

SELECT * FROM (
  SELECT 
  m.shipment_id,
  m.route_id,
  m.leg_sequence_id,
  m.leg_warehouse_id,
  m.leg_ship_method,
  row_number() over (partition by m.route_id order by m.leg_sequence_id desc) as rn
  FROM posimorders.sc_execution_eu.o_detailed_routes_v2 m
) 
WHERE rn=1
FETCH FIRST 100 ROWS ONLY;

WITH TIES(如果您愿意)。

posimorders.sc_execution_eu.o_detailed_routes_v2中的三个级别也似乎是错误的... see the docs