【问题标题】:Update query to Increment column value based on set of other column values in Sybase ASE根据 Sybase ASE 中的一组其他列值更新查询以增加列值
【发布时间】:2021-03-03 21:24:39
【问题描述】:

我正在尝试根据 StudNo、StudentName 更新 SeqNum 列值。每个相同的 StudNo、StudentName 集合都会有一个序列应该递增。

create table #student (
   StudNo int,
   StudentName char(50),
   SeqNum  int default 1, - newly added column
   StudAddress char(50)
)

之前有seqNum(更新数据之前):

StudNo StudentName  StudAddress
1         Ravi        C
2         Ram         XYZ
1         Ravi        A
1         Ravi        B
3         Ram         HJK 

以下是我们需要获取的输出数据(更新后):

StudNo StudentName SeqNum StudAddress
1         Ravi       1     C
2         Ram        1     XYZ
1         Ravi       2     A
1         Ravi       3     B
3         Ram        1     HJK 

在上面的输出数据中,我们在第 1 行、第 3 行、第 4 行有 StudNo 1 和 StudentName 'Ravi'。所以 SeqNum 列的值分别是 1, 2,3。

以下是我的更新后的查询,它不会按预期更新。

update Student set seqNum=seq+1 where StudNo in (select StudNo from Student group by StudNo,StudentName having count(*) > 1)
and StudentName in (select StudentName from Student group by StudNo,StudentName having count(*) > 1)

注意:我们可以得到输出数据顺序 StudNo 和 StudAddress

谁能给我一个关于如何编写更新查询以根据其他列集增加 SeqNum 列值的想法。

提前致谢

【问题讨论】:

  • 请更新问题以包含更新前的数据;另外,请提供有关如何排序数据的详细信息(例如,通过StudAddress?)以获得“正确的”SeqNum(即,您如何知道哪一行应该有SeqNum =1,或=2,或=3)?;最后,到目前为止,您尝试了哪些 T-SQL 代码(以及它生成的“错误”输出是什么)?
  • 嗨@mar​​kp-fuso,请查看上面更新的帖子
  • 根据您想要的输出,在分配 SeqNum 值时(例如,StudAddress 没有排序,因为ABC == 1, UXC == 2, JKL == 3)
  • 这里我提供了示例数据,真实数据将按正确的顺序排列
  • 由于StudAddress 似乎没有任何特定的顺序,因此无法...以编程方式...确保分配SeqNums 使得ABC == 1, @ 987654337@ == 2, JKL == 3;如果想法是保持数据与数据库中当前存在的“顺序”相同......请记住,一般来说,关系数据库中的数据没有“顺序”,除非“顺序”是通过索引、“order by”子句或(可能)单个行的物理存储来强制执行

标签: sql tsql sql-update sybase sap-ase


【解决方案1】:

由于这是 Sybase ASE,我们无法访问其他 RDBMS 产品中存在的某些功能(例如,windows 函数、row_number()、CTE),因此我们必须依靠一些非常基本的 SQL 来更新SeqNum ...

OP 已经声明 SeqNum 列最近被添加到表中,所以我假设表的历史看起来像这样:

create table Student
(StudNo         int
,StudentName    char(50)
,StudAddress    char(50)
)
go

insert Student values (1,'Ravi','C')
insert Student values (2,'Ram' ,'XYZ')
insert Student values (1,'Ravi','A')
insert Student values (1,'Ravi','B')
insert Student values (3,'Ram' ,'HJK')
go

select StudNo, StudentName, StudAddres
from Student order by 1,2,3
go

 StudNo StudentName StudAddress
 ------ ----------- -----------
      1 Ravi        A
      1 Ravi        B
      1 Ravi        C
      2 Ram         XYZ
      3 Ram         HJK

alter table Student add SeqNum int default 1 null
go

select StudNo, StudentName, SeqNum, StudAddress
from Student order by 1,2,4
go

 StudNo StudentName SeqNum StudAddress
 ------ ----------- ------ -----------
      1 Ravi          NULL A
      1 Ravi          NULL B
      1 Ravi          NULL C
      2 Ram           NULL XYZ
      3 Ram           NULL HJK

根据我们可以看到的 OP 期望的结果:

  • SeqNum 应该以 1 开头,对于具有相同 StudNo + StudentName 对的每一行,以 1 递增
  • 当我们遇到新的 StudNo + StudentName 对时,SeqNum 应该重置为 1

Op 没有提供任何关于如何确定哪些行(具有相同的 StudNo + StudentName 对)应该使用哪些 SeqNum 值编号的指令,因此对于这个答案,我将假设 StudAddress是唯一的(对于给定的StudNo + StudentName 对);从这里我将使用StudAddress (s2.StudAddress < s1.StudAddress) 的顺序为每个StudNo + StudentName 对生成一个唯一的SeqNum

update Student
set    SeqNum = (select count(*) + 1
                 from   Student s2
                 where  s2.StudNo       = s1.StudNo
                 and    s2.StudentName  = s1.StudentName
                 and    s2.StudAddress  < s1.StudAddress)
from   Student s1
go

这给我们留下了以下内容:

select StudNo, StudentName, SeqNum, StudAddress
from Student order by 1,2,4
go

 StudNo StudentName SeqNum StudAddress
 ------ ----------- ------ -----------
      1 Ravi             1 A
      1 Ravi             2 B
      1 Ravi             3 C
      2 Ram              1 XYZ
      3 Ram              1 HJK

注意:以上代码已在 Sybase ASE 15.7 SP140

上验证

【讨论】:

    猜你喜欢
    • 2015-10-10
    • 2021-10-19
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多