【问题标题】:Columns with Sequence Number具有序列号的列
【发布时间】:2018-08-15 16:32:47
【问题描述】:
create table Account(A_number number, B_number number, C_number, A_number_mask number as 
GENERATED ALWAYS AS IDENTITY, B_number_mask number, C_number_mask )  

插入后的表值是

A_number B_number  C_number A_mask_number B_mask C_mask
10        100      200      1             NULL   NULL
20        100      200      2             NULL   NULL
30        101      201      3             NULL   NULL
40        102      202      4             NULL   NULL
50        103      203      5             NULL   NULL
60        101      201      6             NULL   NULL

现在我必须填充

  • B_number 的 B_number_mask
  • C 编号的 C_number_mask

当我屏蔽或创建序列时,新列也应该具有父列中重复值的重复值。

输出应该是这样的:

A_number B_number  C_number A_mask_number B_mask C_mask
10        100      200      1             1      1000
20        100      200      2             1      1000
30        101      201      3             2      2000 
40        102      202      4             3      3000
50        103      203      5             4      4000    
60        101      201      6             2      2000

我必须将排序的列而不是父列提供给用户。 请随意使用序列的任何起始编号。

【问题讨论】:

  • 向我们展示您如何创建第二个表以及如何填充
  • 您好,我还没有创建第二个表。我想在我的第二张桌子上得到这个输出。对于 A_number_mask,我可以在创建第二个表时使用一个序列,出于安全目的,我可以显示该表而不是 A_number。但我不知道我应该为 B_mask_number 尝试什么逻辑,因为它有重复。我需要一个基于 B_number 的序列或唯一值,前提是我为重复的 B_number 获得相同的 B_number_mask
  • 解释你想要达到的目标。现在我无法理解逻辑。英语是您的主要语言吗?因为如果你说“我有”意味着已经完成,而不是“我想要”或“我需要”意味着你需要帮助
  • 感谢您的指正。英语不是我的主要语言,我正在尽力解释我的要求。对于 A_number 和 B_number 我想创建一个随机的唯一编号。这样我就不必出于安全目的向公司提供实际价值。我可以使用序列为 A_number 创建唯一编号。但是如果我使用序列,B_number 具有重复值,对于相同的 B_number 值,我会得到不同的值,这是我不想要的。因此,如果有任何其他方法可以通过 SQL 实现要求,请指导我。
  • 下次试试用谷歌翻译吧。我们也有其他语言的 SO,这可能会有所帮助。但我会再次尝试回答你的问题

标签: sql duplicates db2 unique sequence


【解决方案1】:

使用ROW_NUMBER 创建序列。

SELECT A_number,
       B_number,
       ROW_NUMBER() OVER(ORDER BY RAND()) as A_number_mask, 
       ROW_NUMBER() OVER(PARTITION BY B_number ORDER BY RAND()) as B_number_mask
FROM Account

【讨论】:

  • 我的需求需要不同系列的数字。我们的数据有 1000000000,2000000000 等系列的 A_number。但它没有 5000000000 系列。所以在我的序列中,我将使用这个系列来获得独特的价值。同样,我们没有 B_number 的系列 7000000000。我将不得不使用这个系列来获取基于 B_number 的唯一编号。
  • 尝试使用 row_)number
  • 好的,我试试这个聚合
  • ORDER BY rand() 很好,因为它可以帮助您隐藏行之间的关系。但是如果表太大,可能会导致性能问题。所以考虑到这一点。
【解决方案2】:

您可以在插入数据时使用标识列自动生成唯一编号

create table Account_New(A_number number,
                         B_number number,
                         A_number_mask BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH -1, INCREMENT BY -1)
                         B_number_mask BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 7000000000, INCREMENT BY 1)
)  

只有两个选项来显示可能性 - 一个正在生成负数,另一个正在使用您未使用的系列。

【讨论】:

  • 一张表只能有一个用 IDENTITY 属性定义的列。这里 B_number 不是唯一的。 B_number_mask 应该基于 B_number 创建,并且它应该为重复的 B_number 提供重复的序列号。例如,如果 B_number 是 1、2、3、3、3、4,那么 B_mask_number 应该是 700、701、702、702、702、703。我不想使用算术运算。如果有任何其他方法可以实现这一点,请告诉我
  • 抱歉,您可以定义一个序列而不是第二个身份列
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2018-10-10
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多