多次将数据从一个表中的列复制到另一表中的列

时间:2019-02-22 11:06:07

标签: sql-server

我有2个表中的数据,如下所示:

Table1
ID Quality
1  Q1
2  Q2
3  Q3

Table2
ID Quality 
1   
2   
3
4
5
6
7
8
9

我想将Table2更新如下:

Table2
ID  Quality 
1  Q1
2  Q2
3  Q3
4  Q1
5  Q2
6  Q3
7  Q1
8  Q2
9  Q3

我已经检查了一些关于SO的答案,但是在尝试使用交叉联接时,似乎不正确。

2 个答案:

答案 0 :(得分:3)

使用模数加入:

SELECT
    t2.ID,
    t1.Quality
FROM Table1 t1
INNER JOIN Table2 t2
    ON 1 + (t2.ID - 1) % 3 = t1.ID;

请注意,我们不需要在此处使用NULLIFISNULL

如果第二张表可能没有连续的ID,但是您仍然希望使用该一般顺序来分配质量,那么我们可以尝试使用ROW_NUMBER生成:

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;

答案 1 :(得分:2)

这就是你所追求的:

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;

您需要使用Modulus,但还要满足0的要求(如3 % 3 = 0)。