SQL更新表中重复行的第一条记录

SQL更新表中重复行的第一条记录,sql,sql-server-2008,Sql,Sql Server 2008,我希望在表中发现重复项时更新第一条记录 CREATE TABLE tblauthor ( Col1 varchar(20), Col2 varchar(30) ); CREATE TABLE tblbook ( Col1 varchar(20), Col2 varchar(30), Col3 varchar(30) ); INSERT INTO tblAuthor (Col1,Col2)

我希望在表中发现重复项时更新第一条记录

CREATE TABLE tblauthor 
    (
     Col1 varchar(20), 
     Col2 varchar(30)   
    );

CREATE TABLE tblbook 
    (
     Col1 varchar(20), 
     Col2 varchar(30),
     Col3 varchar(30)     
    );

INSERT INTO tblAuthor
(Col1,Col2)
VALUES
('1', 'John'),
('2', 'Jane'),
('3', 'Jack'),
('4', 'Joe');

INSERT INTO tblbook
(Col1,Col2,Col3)
VALUES
('1', 'John','Book 1'),
('2', 'John','Book 2'),
('3', 'Jack','Book 1'),
('4', 'Joe','Book 1'),
('5', 'Joe','Book 2'),
('6', 'Jane','Book 1'),
('7', 'Jane','Book 2');
我想要完成的更新结果应该如下更新记录。我想要tblbook.col3=1st

select * from tblbook

('1', 'John','1st'),
('3', 'Jack','1st'),
('4', 'Joe','1st'),
('6', 'Jane','1st');

甚至无法使用distinct完成此操作。

使用
行数
为按作者姓名(
col2
)分组的每一行分配一个数字,然后更新编号为
1

update tblbook set col3 = '1st'
where col1 in(
    select
        col1
    from (
        select 
            tblbook.col1,
            tblbook.col2,
            tblbook.col3,
            ROW_NUMBER() OVER (PARTITION BY tblbook.Col2 order by tblbook.col1) as rownum
        from tblbook 
            left outer join tblauthor on tblbook.col2 = tblauthor.col2
    ) [t1]
    where [t1].rownum = 1
)

Fiddle:

使用
行号
为按作者姓名分组的每一行分配一个编号(
col2
),然后更新编号为
1

update tblbook set col3 = '1st'
where col1 in(
    select
        col1
    from (
        select 
            tblbook.col1,
            tblbook.col2,
            tblbook.col3,
            ROW_NUMBER() OVER (PARTITION BY tblbook.Col2 order by tblbook.col1) as rownum
        from tblbook 
            left outer join tblauthor on tblbook.col2 = tblauthor.col2
    ) [t1]
    where [t1].rownum = 1
)

Fiddle:

使用
行号
为按作者姓名分组的每一行分配一个编号(
col2
),然后更新编号为
1

update tblbook set col3 = '1st'
where col1 in(
    select
        col1
    from (
        select 
            tblbook.col1,
            tblbook.col2,
            tblbook.col3,
            ROW_NUMBER() OVER (PARTITION BY tblbook.Col2 order by tblbook.col1) as rownum
        from tblbook 
            left outer join tblauthor on tblbook.col2 = tblauthor.col2
    ) [t1]
    where [t1].rownum = 1
)

Fiddle:

使用
行号
为按作者姓名分组的每一行分配一个编号(
col2
),然后更新编号为
1

update tblbook set col3 = '1st'
where col1 in(
    select
        col1
    from (
        select 
            tblbook.col1,
            tblbook.col2,
            tblbook.col3,
            ROW_NUMBER() OVER (PARTITION BY tblbook.Col2 order by tblbook.col1) as rownum
        from tblbook 
            left outer join tblauthor on tblbook.col2 = tblauthor.col2
    ) [t1]
    where [t1].rownum = 1
)

Fiddle:

如果您想更新
tblbook
,那么第三列是副本上的
'1st'
,那么您可以使用可更新的CTE轻松完成此操作:

with toupdate as (
      select tbl2.*, row_number() over (partition by col2 order by col1) as seqnum
      from tbl2
     )
update toupdate
    set col3 = '1st'
    where seqnum = 1;

这是我能理解你真正想要的最接近的了。

如果你想更新
tblbook
,那么第三列是关于副本的
'1st'
,那么你可以使用可更新的CTE轻松做到这一点:

with toupdate as (
      select tbl2.*, row_number() over (partition by col2 order by col1) as seqnum
      from tbl2
     )
update toupdate
    set col3 = '1st'
    where seqnum = 1;

这是我能理解你真正想要的最接近的了。

如果你想更新
tblbook
,那么第三列是关于副本的
'1st'
,那么你可以使用可更新的CTE轻松做到这一点:

with toupdate as (
      select tbl2.*, row_number() over (partition by col2 order by col1) as seqnum
      from tbl2
     )
update toupdate
    set col3 = '1st'
    where seqnum = 1;

这是我能理解你真正想要的最接近的了。

如果你想更新
tblbook
,那么第三列是关于副本的
'1st'
,那么你可以使用可更新的CTE轻松做到这一点:

with toupdate as (
      select tbl2.*, row_number() over (partition by col2 order by col1) as seqnum
      from tbl2
     )
update toupdate
    set col3 = '1st'
    where seqnum = 1;

这是我能理解的最接近您真正想要的内容。

sql FIDLE[link]您想要更新的意思是什么,为什么您想要的结果只包含唯一的记录?是否要删除其他内容?我也会像您在sql FIDLE中那样更改上面的示例数据,因为这目前不起作用。sql FIDLE[link]您想要更新的意思是什么,为什么您想要的结果只包含唯一的记录?是否要删除其他内容?我也会像您在sql FIDLE中那样更改上面的示例数据,因为这目前不起作用。sql FIDLE[link]您想要更新的意思是什么,为什么您想要的结果只包含唯一的记录?是否要删除其他内容?我也会像您在sql FIDLE中那样更改上面的示例数据,因为这目前不起作用。sql FIDLE[link]您想要更新的意思是什么,为什么您想要的结果只包含唯一的记录?是否要删除其他内容?我也会像您在sql FIDLE中那样更改上面的示例数据,因为这目前不起作用。工作非常完美。谢谢工作做到了完美。谢谢工作做到了完美。谢谢工作做到了完美。谢谢我还没试过你的,但我会试试sqlfiddle。谢谢。我还没试过你的,但我会试试sqlfiddle。谢谢。我还没试过你的,但我会试试sqlfiddle。谢谢。我还没试过你的,但我会试试sqlfiddle。谢谢