sql 中的复杂 update/join

Complex update/join in sql

我有一些复杂的连接语句,我想让它变得更简单。(或者保留它但让工作正常:))

CREATE TABLE #Temp1
(
    ID      INT IDENTITY,
    Name1   VARCHAR(100),
    Value1  INT
)


CREATE TABLE #Temp2
(
    ID      INT IDENTITY,
    Name2   VARCHAR(100),
    Value2  INT,
    Value1  INT
)


INSERT INTO #Temp1
SELECT 'Nm_1', 111 UNION ALL
SELECT 'Nm_2', 222 


INSERT INTO #Temp2(Name2, Value2)
SELECT 'Nm_3', 333 UNION ALL
SELECT 'Nm_4', 444 UNION ALL 
SELECT 'Nm_5', 555 UNION ALL
SELECT 'Nm_6', 666 UNION ALL
SELECT 'Nm_7', 777 UNION ALL
SELECT 'Nm_8', 888 UNION ALL
SELECT 'Nm_9', 999 UNION ALL
SELECT 'Nm_4', 444 UNION ALL 
SELECT 'Nm_5', 555 UNION ALL
SELECT 'Nm_6', 666 UNION ALL
SELECT 'Nm_7', 777 UNION ALL
SELECT 'Nm_8', 888 UNION ALL
SELECT 'Nm_9', 999 UNION ALL
SELECT 'Nm_10',100 UNION ALL
SELECT 'Nm_11',110

这里有两个 table。 First table in ordinary 其中可以有任意行数。第二取决于第一个 one.I 解释如何。 #Temp2 中的第一行 table 是静态的,第 2 行到第 7 行的重复次数与 #Temp1 中的计数相同,最后 3 行也是静态的。

在我的考试中,#Temp1 中有两行,所以

SELECT 'Nm_4', 444 UNION ALL 
SELECT 'Nm_5', 555 UNION ALL
SELECT 'Nm_6', 666 UNION ALL
SELECT 'Nm_7', 777 UNION ALL
SELECT 'Nm_8', 888 UNION ALL
SELECT 'Nm_9', 999 UNION ALL

是两次,如果我有3次就会有6 * 3行。

现在我想以这种方式更新#Temp2 table 中的 Value1 列。

select Value1 from #Temp1 where ID =1

此值将写入 #Temp2 table,其中 ID>=2 且 ID<=7

select Value1 from #Temp1 where ID =2

应该在 #Temp2 table 中,其中 ID>=8 且 ID<=13。

我试着这样写join

UPDATE #Temp2
SET Value1 = a.Value1
FROM #Temp1 AS a
INNER JOIN #Temp2 AS b
    ON 2*a.ID - b.ID IN (-(2*a.ID-1)-(a.ID-2),
                         -(2*a.ID-1)-(a.ID-1),
                         -(2*a.ID-1)-(a.ID-0),
                         -(2*a.ID-1)-(a.ID+1),
                         -(2*a.ID-1)-(a.ID+2),
                         -(2*a.ID-1)-(a.ID+3))

但这是错误的,如果你运行这个脚本你可以看到。 有人可以帮忙吗?

显然应该使用 ID 列进行连接

您可以将子查询与 CASE WHEN 一起使用。 您可以使用 BETWEEN 标签来处理您的 ID。

UPDATE #Temp2
SET #Temp2.Value1 = (CASE WHEN ID BETWEEN 2 AND 7 THEN (SELECT a.Value1 FROM #Temp1 a WHERE a.ID = 1)
                          WHEN ID BETWEEN 8 AND 13 THEN (SELECT a.Value1 FROM #Temp1 a WHERE a.ID = 2)
                     END)
WHERE #Temp2.ID BETWEEN 2 AND 13

这个简单的连接工作:

UPDATE #Temp2
SET Value1 = a.Value1
FROM #Temp1 AS a
INNER JOIN #Temp2 AS b
ON b.ID BETWEEN (a.ID*6-4) AND (a.ID*6+1)

您可以试试这个应该可以解决您的问题:

DECLARE @Counter int = 0,
        @Rows int

Set @Rows = (Select count(*) from #Temp1)

While (@Counter < @Rows)
Begin

    Update #Temp2
    Set Value1 = (Select Value1 from #Temp1 where ID = @Counter + 1)
    Where ID between 2 + (@Counter * 6) and 7 + (@Counter * 6)
    Set @Counter = @Counter + 1

End