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。谢谢