【问题标题】:SQL SERVER, ID column update to unique valueSQL SERVER,ID 列更新为唯一值
【发布时间】:2022-09-23 18:46:30
【问题描述】:

早上好,我的 SQL 服务器有一个大问题,它没有以正确的方式设置,该服务器有一些关系表。 我有一个 TableA,其中有 2 列,ID 和 NUMBER_ORDER。 我有一个 TableB,其中有 10 列,第一列是与 TableA 相关的 ID 列,其他列与每个 NUMBER_ORDER 的 TEST 相关。 例子: 表

ID NUMBER_ORDER
1 110000
2 110001
3 110002
4 110003

表B

ID Test date NumberofTest
1 this is a test for 110000 20/09/2022 10:15 1
1 this is another test for 110000 20/09/2022 10:20 2
2 this is a test for 110001 21/09/2022 9:10 1
2 this is another test for 110001 21/09/2022 9:20 2

正如您在 TableB 中看到的,TableA 的每个 ID 出现的次数更多,因为有不同的测试,这应该是这样的。

现在我解释我的问题:

在这个表中没有设置 PrimaryKey 索引。 你可以想象的刚刚发生的是,现在 TableA 有不同 NUMBER_ORDER 的双 ID 在 Table_B 中没有太大变化,因为记录被正确写入,但是例如如果 ID \"1\" 加倍,我们在 TableB 中也将它加倍,像这样, 示例 DOUBLEID: 表

ID NUMBER_ORDER
1 110000
1 110001
2 110002
3 110003

表B

ID Test date NumberofTest
1 this is a test for 110000 20/09/2022 10:15 1
1 this is another test for 110000 20/09/2022 10:20 2
1 this is a test for 110001 21/09/2022 9:10 1
1 this is another test for 110001 21/09/2022 9:20 2

我的问题是:

如何在不丢失 TableB 中的关系以使我拥有的所有 ID 唯一的情况下重置 TableA 的 ID 列? 想象一下,我在表 A 中有 1000 个 ID 加倍,通常对于 TableB 中的每个 ID,都有 150 行不同的测试,所以我不能手动更新它们。 如果您只花时间阅读它,请提前致谢。 我希望我的问题很清楚。

编辑:是否存在一种方法可以从 id 列中删除所有数字并使用 auto_increment 或循环重置它们?如果我在 TableA 中执行它会自动在 TableB 上执行相同的操作吗?因为它会是完美的,所以这 2 个表中的 ID 只是一个关系,看看什么测试与什么 NUMBER_ORDER 相关,所以它是否从 1 更改为 2 并不重要,但重要的是使其唯一。

此致。

根据要求,我会尽量使表格更逼真。

表A应该是:

ID ORDER
1 112563
2 116558
3 113365
4 102567
5 104758
6 105967

表B应该是:

ID teststep key min max value res Time
1 AFL AFL_1_engine 3500 3700 3567 OK 2018-12-19 16:52
1 AFL AFL_4_sitting - - - OK 2018-12-19 16:53
2 AFL AFL_1_engine 3500 3700 3780 NOK 2019-10-15 10:00
2 AFL AFL_1_engine - - - OK 2019-10-15 10:02

exc... 对于其他 ID\'s

    标签: sql sql-server tsql


    【解决方案1】:

    当此查询返回应该在 TableA 中的正确值时:

    select
      row_number() over (order by value) as Id,
      value as NUMBER_ORDER
    FROM (
       select 
          distinct  value
       from TableB
       cross apply string_split(test,' ')
       where value like '1%'
      ) x
    

    你应该得到这个DBFIDDLE的帮助

    【讨论】:

    • 感谢您的回答,但是我不能删除TableA,因为它是在生产中使用的,它会阻塞整个过程,我也没有权限这样做:'(
    • 你应该联系一位有权在白天(或晚上)安静的时间做这类事情的同事。
    • 无论如何,我想我也应该查询的这一部分: cross apply string_split(test,' ') where value like '1%' 它有什么作用?
    • 如果该解决方案指的是示例“测试”部分,它将不起作用,因为真实表上唯一存在的东西是 ID,其他列只是表格式的一个示例。
    • STRING_SPLIT 将拆分字段 test(即 this is a test for 110000),与 value like 1%` 我做一个简单的检查以仅返回在您的示例中均以1 开头的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多