SQL Update表中的Duplicate行的第一条记录

时间:2014-08-18 20:53:31

标签: 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)
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');

似乎无法用不同的方式完成这项工作。

2 个答案:

答案 0 :(得分:3)

使用ROW_NUMBER为按作者姓名(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
)

小提琴:http://sqlfiddle.com/#!3/4b6c8/20/0

答案 1 :(得分:0)

如果您要更新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;

这是我能够最了解你真正想要的东西。