我有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的答案,但是在尝试使用交叉联接时,似乎不正确。
答案 0 :(得分:3)
使用模数加入:
SELECT
t2.ID,
t1.Quality
FROM Table1 t1
INNER JOIN Table2 t2
ON 1 + (t2.ID - 1) % 3 = t1.ID;
请注意,我们不需要在此处使用NULLIF
和ISNULL
。
如果第二张表可能没有连续的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
)。