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