【问题标题】:create primary key ROW_NUMBER() over function sql teradata在函数 sql teradata 上创建主键 ROW_NUMBER()
【发布时间】:2019-10-21 08:33:16
【问题描述】:

我想在我的select 语句中创建一个主键。我读到我可以使用ROW_NUMBER() over 函数。但由于它将是主键,我没有任何列用于overpartition by。我尝试只使用select row_number() as PK,但这会引发错误[3706] syntax error: expected something between ( and as keyword

我该如何解决这个问题?

【问题讨论】:

    标签: sql teradata teradata-sql-assistant


    【解决方案1】:

    您需要一个over 子句。我不确定 order by 在 Teradata 中是否是可选的(我手头没有版本):

    row_number() over ()
    row_number() over (order by <some column here>)
    

    【讨论】:

    • row_number() over () 抛出 expect something between ( and ) 的错误
    • 你必须有一个 order by,partition by 是可选的。
    【解决方案2】:

    您是否尝试创建一个自动生成的数字,然后您可以将其用作主索引,以便在 Teradata 节点中的 AMP 之间进行良好分布(您在 select 语句中将其称为 PK)?

    如果是这样,并且如果您不想使用 IDENTITY COLUMN 数据类型为您执行此操作(优缺点存在),那么您可以通过简单地使用 csum 来生成这样一个自动编号以用作 Teardata 中的 PI功能。 (请注意,您的目标表不能太大,即超过几十万到一百万)

    SELECT 
       mx.max_id + csum(1,1) as PI_column
      ,src.columnABC
    from 
      source_table src
    cross join 
      (SELECT max(id) as max_id from target_table) as mx
    group by 1,2
    order by 1;
    

    这将生成一个新的 PI/PK/Unique ID 列,用于 PI,并且对于 ColumnABC 的每个唯一组合具有良好的分布。

    希望这会有所帮助。

    如果我一开始的“如果”陈述不正确,请进一步解释您要做什么,我很乐意为您提供帮助。

    【讨论】:

    • 您是否尝试创建一个自动生成的数字,然后您可以将其用作主索引,以便在 Teradata 节点中的 AMP 之间进行良好分布(您在 select 语句中将其称为 PK)? - 是的
    • 那么请按照我刚才给出的例子进行操作。通过使用 csum 函数生成新键并将其插入到查找表中。然后从您的源/阶段表中选择左外连接到您的查找表以获取生成的键并将它们加载到您的目标表中。
    • 你能正确缩进你的代码吗?我的表有超过一百万行 - 这会改变解决方案吗?
    • 代码已缩进。不是普通的堆栈溢出用户:) 请原谅我在这里缺乏界面技能。你的总行数是多少?您的 Teradata 节点容量是多少(例如 4 节点 XXX 系列)无论如何,如果您有数亿行,我想知道为什么需要为这样的数据集生成这样的 PK / PI。也许有一种数据建模技术首先需要将这个数据集分解为更细粒度的 3NF 模型,这将是一个更好的存储解决方案以及更好的查询访问性能。
    • 我有大约 200 万行。 target_table 是什么?我假设source_table 有数据,对吗?我有一个表,我将从中提取数据,然后在我的选择语句中创建一个主键。所以只有一个源表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2014-01-03
    • 2019-03-13
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多