Sql server 多次将数据从一个表中的列复制到另一个表中的列
我有以下两个表中的数据:Sql server 多次将数据从一个表中的列复制到另一个表中的列,sql-server,Sql Server,我有以下两个表中的数据: Table1 ID Quality 1 Q1 2 Q2 3 Q3 Table2 ID Quality 1 2 3 4 5 6 7 8 9 Table2 ID Quality 1 Q1 2 Q2 3 Q3 4 Q1 5 Q2 6 Q3 7 Q1 8 Q2 9 Q3 我想将表2更新如下: Table1 ID Quality 1 Q1 2 Q2 3 Q3 Table2 ID Quality 1 2 3 4
Table1
ID Quality
1 Q1
2 Q2
3 Q3
Table2
ID Quality
1
2
3
4
5
6
7
8
9
Table2
ID Quality
1 Q1
2 Q2
3 Q3
4 Q1
5 Q2
6 Q3
7 Q1
8 Q2
9 Q3
我想将表2更新如下:
Table1
ID Quality
1 Q1
2 Q2
3 Q3
Table2
ID Quality
1
2
3
4
5
6
7
8
9
Table2
ID Quality
1 Q1
2 Q2
3 Q3
4 Q1
5 Q2
6 Q3
7 Q1
8 Q2
9 Q3
我已经检查了一些答案,但似乎我没有得到正确的时候,试图使用交叉连接 使用模数连接:
SELECT
t2.ID,
t1.Quality
FROM Table1 t1
INNER JOIN Table2 t2
ON 1 + (t2.ID - 1) % 3 = t1.ID;
请注意,这里不需要使用null if
和ISNULL
如果第二个表可能没有连续的ID,但您仍然希望使用该常规顺序分配质量,那么我们可以尝试使用行编号生成:
WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY ID) ID
FROM Table2
)
SELECT
t2.ID,
t1.Quality
FROM Table1 t1
INNER JOIN cte t2
ON 1 + (t2.ID - 1) % 3 = t1.ID;
使用模数连接:
SELECT
t2.ID,
t1.Quality
FROM Table1 t1
INNER JOIN Table2 t2
ON 1 + (t2.ID - 1) % 3 = t1.ID;
请注意,这里不需要使用null if
和ISNULL
如果第二个表可能没有连续的ID,但您仍然希望使用该常规顺序分配质量,那么我们可以尝试使用行编号生成:
WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY ID) ID
FROM Table2
)
SELECT
t2.ID,
t1.Quality
FROM Table1 t1
INNER JOIN cte t2
ON 1 + (t2.ID - 1) % 3 = t1.ID;
这就是你想要的:
USE Sandbox;
GO
CREATE TABLE dbo.Table1 (ID int, Quality char(2))
INSERT INTO dbo.Table1 (ID,Quality)
VALUES(1,'Q1'),(2,'Q2'),(3,'Q3');
CREATE TABLE dbo.Table2 (ID int, Quality char(2));
INSERT INTO dbo.Table2 (ID)
VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9);
GO
UPDATE T2
SET T2.Quality = T1.Quality
FROM dbo.Table1 T1
JOIN dbo.Table2 T2 ON T1.ID = ISNULL(NULLIF((T2.ID % 3),0),3);
SELECT *
FROM Table2;
GO
DROP TABLE dbo.Table2;
DROP TABLE dbo.Table1;
您需要使用模数,但也要满足0的要求(如3%3=0
)。这就是您想要的:
USE Sandbox;
GO
CREATE TABLE dbo.Table1 (ID int, Quality char(2))
INSERT INTO dbo.Table1 (ID,Quality)
VALUES(1,'Q1'),(2,'Q2'),(3,'Q3');
CREATE TABLE dbo.Table2 (ID int, Quality char(2));
INSERT INTO dbo.Table2 (ID)
VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9);
GO
UPDATE T2
SET T2.Quality = T1.Quality
FROM dbo.Table1 T1
JOIN dbo.Table2 T2 ON T1.ID = ISNULL(NULLIF((T2.ID % 3),0),3);
SELECT *
FROM Table2;
GO
DROP TABLE dbo.Table2;
DROP TABLE dbo.Table1;
您需要使用模数,但也要满足0的要求(如3%3=0
)。如果所有ID都以1乘以1的方式递增,并且op实际需要此分布,则这将非常有效。这个问题还不清楚。不太清楚,3%3=0
@EzLo我解决了你的问题。在这种情况下,我们可以使用行\号
。如果所有ID都以1乘以1的方式递增,并且op实际上想要这个分布,那么这将非常有效。这个问题还不清楚。不太清楚,3%3=0
@EzLo我解决了你的问题。在这种情况下,我们可以使用行号
。如果每个表上缺少一个ID,会发生什么情况?预期的结果是什么?我们假设你的记录之间有联系,但如果你能解释一下你想要的逻辑,那就太好了。例如:如果表2上不存在ID 3,您希望ID 4是Q3还是Q1?如果每个表上都缺少ID,会发生什么情况?预期的结果是什么?我们假设你的记录之间有联系,但如果你能解释一下你想要的逻辑,那就太好了。例如:如果表2中不存在ID 3,您希望ID 4是Q3还是Q1?您不需要在此处使用null如果,请参阅我的修订答案。@TimBiegeleisen+1-1在此处的逻辑非常类似。不确定它是否会对性能产生任何影响,因为一旦引入模数,可编程性就会丢失。不确定您所说的NULLIF
(因此ISNULL
)是什么意思如果不需要@TimBiegeleisen,除非您指的是使用+1-1
逻辑或性能?如果我把它去掉,答案就会和你原来的一样有缺陷。因此,我假设你在谈论绩效。也许你可以详细说明一下?谢谢(至于投票,我已经投了一票)。你不需要在这里使用NULLIF
,请看我的修正答案。@TimBiegeleisen+1-1在这里的逻辑非常相似。不确定它是否会对性能产生任何影响,因为一旦引入模数,可编程性就会丢失。不确定您所说的NULLIF
(因此ISNULL
)是什么意思如果不需要@TimBiegeleisen,除非您指的是使用+1-1
逻辑或性能?如果我把它去掉,答案就会和你原来的一样有缺陷。因此,我假设你在谈论绩效。也许你可以详细说明一下?谢谢(至于投票,我已经投了一票)。