简体   繁体   English

SQL中的复杂更新/联接

[英]Complex update/join in sql

I have some complex join statement and want to make it easier.(or stay it but make working right :)) 我有一些复杂的join语句,想要使其变得更简单。(或保留它,但可以正常使用:))

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

Here is two tables. 这是两个表。 First table in ordinary which can have any number of rows. 普通的第一个表,可以有任意数量的行。 Second depends on first one.I explain how. 第二要看第一个,我解释一下。 First row in #Temp2 table is static, rows from 2 to 7 repeated as much as count from #Temp1 is and last 3 rows are also static. #Temp2表中的第一行是静态的,从2到7的行重复的次数与#Temp1中的计数相同,而最后3行也是静态的。

In my examle I have two row in #Temp1, so 在我的例子中,我在#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

are twice, if i have 3 there will be 6 * 3 row. 是两次,如果我有3将有6 * 3行。

Now I want to make update Value1 column in #Temp2 table in such way. 现在,我想以这种方式在#Temp2表中更新Value1列。

select Value1 from #Temp1 where ID =1 从#Temp1中选择Value1,其中ID = 1

this value would be written in #Temp2 table where ID>=2 and ID<=7 该值将写入ID> = 2和ID <= 7的#Temp2表中

select Value1 from #Temp1 where ID =2 从ID = 2的#Temp1中选择Value1

should be in #Temp2 table where ID>=8 and ID<=13. 应该在ID> = 8和ID <= 13的#Temp2表中。

I try to write join like this 我尝试这样写联接

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))

But it's wrong, if you run this script you can see. 但这是错误的,如果您运行此脚本可以看到。 Can anybody help? 有人可以帮忙吗?

Join should be obviously made with ID column 显然应该使用ID列进行联接

This simple join work: 这个简单的加入工作:

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)

You can use a SubQuery with CASE WHEN . 您可以将子查询与CASE WHEN And you can use the BETWEEN tag to handle your IDs. 您可以使用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

You could try this which should solve your problem: 您可以尝试以下方法来解决您的问题:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM