繁体   English   中英

SQL Server:行组的复杂操作唯一代码

[英]SQL Server: complex operation unique code for groups of rows

我有一个表,其中大多数列都填充有数据。 在该表中,我有行,其中4列有重复数据。 我想做这样的事情:

检查所有行,将所有数据按这四列分组(一组=这4列一个唯一数据),并在最后一列中对它们签名UniqueCode UniqueCode用于组。

所以,当我有这样的事情:

Name Street HouseNumber PostCode  UniqueCode
Cos  Cos    Cos         Cos
Cos  Cos    Cos         Cos 

我想用相同的代码填充UniqueCode 我想编写一个查询,清除所有当前的uniqueCode并填充new和write trigger (我称它正确吗?),对新添加的行执行相同的操作。

有可能在sql中记录该行为?

还是我需要在程序中的代码中执行此操作?

你能帮助我吗?

对不起,我的英语不好。

假设您有一张与此表类似的表:

create table Persons
(
    ID int identity primary key,
    Name varchar(100),
    Street varchar(100),
    HouseNumber int,
    PostCode  varchar(100),
    UniqueCode uniqueidentifier
)

您将创建一个触发器,以查找已经输入的具有相同组合键的人员:

create trigger AssignPersonGroup on Persons
after insert, update
as
    set nocount on

    update Persons
    set UniqueCode = 
    isnull(
       (select top 1 UniqueCode from Persons
       where UniqueCode is not null
         and Inserted.Name = Persons.Name
         and Inserted.Street = Persons.Street
         and Inserted.HouseNumber = Persons.HouseNumber
         and Inserted.PostCode = Persons.PostCode)
      , newid())
    from Inserted inner join Persons
      on Inserted.ID = Persons.ID

并假设这是数据:

insert into persons (Name, Street, HouseNumber, PostCode)
values ('Zagor', 'Darkwood', 23, '01010')
insert into persons (Name, Street, HouseNumber, PostCode)
values ('Zagor', 'Darkwood', 23, '01010')
insert into persons (Name, Street, HouseNumber, PostCode)
values ('Chico', 'Darkwood', 23, '01010')

然后

select * 
from Persons

将提供:

ID  Name    Street  HouseNumber PostCode    UniqueCode
1   Zagor   Darkwood         23 01010   A113D12D-F730-42DD-B3EE-AC33E34C0679
2   Zagor   Darkwood         23 01010   A113D12D-F730-42DD-B3EE-AC33E34C0679
3   Chico   Darkwood         23 01010   FD0739AF-525C-42C2-B929-0AB8EEAC3A73

如果执行以下两个更新,则现有数据将被更新:

update persons
  set uniquecode = newid()

update Persons 
   set uniqueCode=
   (
      select top 1 uniqueCode
      from Persons groups
       where UniqueCode is not null
         and groups.Name = Persons.Name
         and groups.Street = Persons.Street
         and groups.HouseNumber = Persons.HouseNumber
         and groups.PostCode = Persons.PostCode
      order by ID
    )

它们是分开的,因为Sql Server在标量表达式之前执行联接。 我的第一个处理方法是在所有列上使用派生表分组并添加newid()列进行更新查询,但是由于执行了对人员表的内部联接,因此每个行再次具有唯一的ID。

请先禁用触发器,然后再重新启用。 不应在程序中设置uniqueCode,而只能在触发器中设置。 您将需要在(名称,街道,门牌号,邮政编码)上创建复合索引,并在UniqueCode上创建另一个索引。

除此之外,我还看到了您关于该项目的其他问题。 你想做什么? 我不确定小学和高中餐桌之间关系的性质。 如果要由特定人员连接它们,则应该有一个带有身份主键的人员表。 这两个表都将引用此表,并且您将毫无疑问地确定某人的学术道路:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM