Sql 更新多个选定行中的值
我有两张桌子。两者的行数相同 样本数据:Sql 更新多个选定行中的值,sql,sql-server,Sql,Sql Server,我有两张桌子。两者的行数相同 样本数据: Table1{ Id, IdTable2Row } Table2 { Id, RedChicken -- LOL } 表1的每一行(列IdTable2Row)都应该获得表2的1行的id(与哪一行无关)。 Table1.IdTable2Row在操作前的每一行中都为空 我怎么能做这样的事 UPDATE Table1 SET IdTable2Row = (SELECT Id FROM [Table2]) 在您的情况下,没有公共列: wi
Table1{
Id, IdTable2Row
}
Table2 {
Id, RedChicken -- LOL
}
表1的每一行(列IdTable2Row)都应该获得表2的1行的id(与哪一行无关)。
Table1.IdTable2Row在操作前的每一行中都为空
我怎么能做这样的事
UPDATE Table1 SET IdTable2Row = (SELECT Id FROM [Table2])
在您的情况下,没有公共列:
with T1 as
(
select Table1.*, row_number() over (order by anycolumn) rn
from Table1
)
update T1
set idtablerow = t2.id
from T1
inner join
(
select x1.*, row_number() over (order by id) rn
from Table2 x1
) T2
on t1.rn = t2.rn
应在SQL SERVER中工作如果有公共列,则可以加入表并更新
update a set a.IdTable2Row=b.Id from
Table1 a ,Table2 b
where a.column=b.column
如果我理解正确,您需要将第1行与第1行匹配。我提出了一个解决方案:
declare @Table1 table(
Id INT,
IdTable2Row INT NULL
)
declare @Table2 table(
Id INT, RedChicken varchar(10) -- LOL
)
INSERT INTO @Table1
VALUES
(
1,NULL
),(
2,NULL
),(
3,NULL
);
INSERT INTO @Table2
VALUES
(
10,'s'
),(
20,'a'
),(
30,'b'
);
SELECT *
FROM @Table1 ;
SELECT *
FROM @Table2;
WITH cte1 AS
(
SELECT
ROW_NUMBER() over(ORDER by Id) AS rown
,Id
,IdTable2Row
FROM @Table1
),
cte2 AS
(
SELECT ROW_NUMBER() over(ORDER by Id) AS rown
,Id
,RedChicken
FROM @Table2
)
UPDATE t
SET IdTable2Row = c2.Id
FROM @Table1 t
JOIN cte1 c1 ON c1.Id = t.Id
JOIN cte2 c2 ON c1.rown = c2.rown
SELECT *
FROM @Table1
添加一些示例表数据和预期结果-作为格式化文本。id是否可以重复?具体说明预期的输出是什么?它们不能重复没有共同的值来进行连接(T1.something=T2.something)。为什么要使用Over()?我的意思是,顺序是不相关的。除了用于声明RedChicken的未来Table1.IdTable2Row=Table2.Id+1之外,没有公共列。而且,答案似乎与约翰霍克的相似,我已经让它工作了。我将阅读一些关于答案和文档的每一步,以准确理解预期结果是如何获得的!谢谢
declare @Table1 table(
Id INT,
IdTable2Row INT NULL
)
declare @Table2 table(
Id INT, RedChicken varchar(10) -- LOL
)
INSERT INTO @Table1
VALUES
(
1,NULL
),(
2,NULL
),(
3,NULL
);
INSERT INTO @Table2
VALUES
(
10,'s'
),(
20,'a'
),(
30,'b'
);
SELECT *
FROM @Table1 ;
SELECT *
FROM @Table2;
WITH cte1 AS
(
SELECT
ROW_NUMBER() over(ORDER by Id) AS rown
,Id
,IdTable2Row
FROM @Table1
),
cte2 AS
(
SELECT ROW_NUMBER() over(ORDER by Id) AS rown
,Id
,RedChicken
FROM @Table2
)
UPDATE t
SET IdTable2Row = c2.Id
FROM @Table1 t
JOIN cte1 c1 ON c1.Id = t.Id
JOIN cte2 c2 ON c1.rown = c2.rown
SELECT *
FROM @Table1