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
逻辑或性能?如果我把它去掉,答案就会和你原来的一样有缺陷。因此,我假设你在谈论绩效。也许你可以详细说明一下?谢谢(至于投票,我已经投了一票)。