Sql-Server

使用另一個表中的最大值和最小值進行 T-SQL 更新

  • August 4, 2022

我對 SQL 查詢沒有太多經驗,我正在嘗試從我的錯誤中學習和理解。我有兩張桌子:

CREATE TABLE #TempTest
(Id INT,
Number INT)

CREATE TABLE #TempTest2
(Id INT,
MaxNo INT,
MinNo INT)

INSERT INTO #TempTest VALUES (1,4)
INSERT INTO #TempTest VALUES (1,6)
INSERT INTO #TempTest VALUES (1,9)
INSERT INTO #TempTest VALUES (1,7)
INSERT INTO #TempTest VALUES (1,3)
INSERT INTO #TempTest VALUES (1,1)
INSERT INTO #TempTest VALUES (1,5)

INSERT INTO #TempTest2 VALUES (1,0,10)

我正在嘗試MaxNo使用第一個表中小於 8 的最大值和MinNo大於 1 的最小值來更新列:

UPDATE t2
SET MaxNo = IIF(t1.Number>t2.MaxNo AND t1.Number<8,t1.Number, t2.MaxNo),
MinNo = IIF(t1.Number<t2.MinNo AND t1.Number>1,t1.Number, t2.MinNo)
FROM #TempTest2 t2
JOIN #TempTest t1 ON t2.Id=t1.Id

但它用值 4 更新了兩列。我也嘗試過使用

BEGIN Transaction
...
COMMIT

圍繞更新,但結果是一樣的。

我究竟做錯了什麼?正確更新第二個表的最佳方法是什麼?

For MinNo with the minimum bigger than 1= 將忽略(標記為 null)所有小於或等於 1 的記錄。

CASE WHEN Number <=1 THEN NULL ELSE Number END

For max number smaller than 8= 將忽略(標記為 null)所有大於或等於 8 的記錄。

CASE WHEN Number >= 8 THEN NULL ELSE Number END

查詢將如下所示:

UPDATE t2
   SET MaxNo =  t1.MaxNo,
       MinNo = t1.MinNo
FROM 
   #TempTest2 as t2
   INNER JOIN
   (
       SELECT id, 
               MinNo = MIN(CASE WHEN Number <=1 THEN NULL ELSE Number END),
               MaxNo = MAX(CASE WHEN Number >= 8 THEN NULL ELSE Number END)
       FROM 
           #TempTest
       GROUP BY 
           id
   )as t1
   ON t2.Id = t1.Id;

SELECT *
FROM #TempTest2;

輸出:

小提琴手

引用自:https://dba.stackexchange.com/questions/315212