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