Teradata 中的 RowID

Laz*_*der 5 java sql database teradata

我需要使用 select 语句提取行 ID。类似于 oracle 的行 ID 的东西。我将如何在 Teradata 中做到这一点?我正在尝试以下查询,但它抛出错误。

select rowid,emp_id,e_name from test;

Error msg : Syntax error: ROWID not allowed.
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Rob*_*ler 4

尝试ROW_NUMBER()窗口聚合函数:

SELECT ROW_NUMBER() OVER(ORDER BY empid) AS RowID_
     , empid
     , empName
  FROM test;
Run Code Online (Sandbox Code Playgroud)

RANK()与窗口聚合不同,ROW_NUMBER()结果集中不允许出现联系。您的另一种选择是IDENTITY在表中使用一列,但这些很混乱,并且会在以后引起问题。ROW_NUMBER()如果您需要维护代理键,则可以更轻松地将其合并到 ETL 处理中。

应该注意的是,如果您的ORDER BYPARTITION BY列倾斜,则STAT FUNCTION查询计划中的步骤的性能可能会受到大量数据的影响。该PARTITION BY子句是可选的,允许您定义一个窗口,ROW_NUMBER()当分区更改时,该窗口的结果将被重置。不常用与ROW_NUMBER()但可能会派上用场。

编辑 使用代理来唯一标识记录,而不必依赖 ETL 使用中的逻辑和表中的标识列。正确配置后,删除记录时,IDENTITY 列将不会重用任何域值。

  • 另请注意,这与 Oracle“rowid”不同。在 Oracle 中,“rowid”是表中特定行的永久地址(至少我认为它是这样工作的)。如果新行已插入表中,则使用“ROW_NUMBER”将给出不同的结果。我认为 Teradata 中没有类似的概念。只是一个警告和+1。 (4认同)