簡體   English   中英

SQL中的復雜更新/聯接

[英]Complex update/join in sql

我有一些復雜的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

這是兩個表。 普通的第一個表,可以有任意數量的行。 第二要看第一個,我解釋一下。 #Temp2表中的第一行是靜態的,從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表中更新Value1列。

從#Temp1中選擇Value1,其中ID = 1

該值將寫入ID> = 2和ID <= 7的#Temp2表中

從ID = 2的#Temp1中選擇Value1

應該在ID> = 8和ID <= 13的#Temp2表中。

我嘗試這樣寫聯接

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列進行聯接

這個簡單的加入工作:

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)

您可以將子查詢與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

您可以嘗試以下方法來解決您的問題:

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