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

Dan*_*ana 6 sql-server t-sql update

我对 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)
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新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
Run Code Online (Sandbox Code Playgroud)

但它用值 4 更新了两列。我也尝试过使用

BEGIN Transaction
...
COMMIT
Run Code Online (Sandbox Code Playgroud)

各地更新,但结果是一样的。

我究竟做错了什么?正确更新第二个表的最佳方法是什么?

Sab*_*n B 4

对于MinNo with the minimum bigger than 1= 会忽略(标记为 null)所有小于或等于 1 的记录。

 CASE WHEN Number <=1 THEN NULL ELSE Number END
Run Code Online (Sandbox Code Playgroud)

对于max number smaller than 8= 将忽略(标记为 null)所有大于或等于 8 的记录。

 CASE WHEN Number >= 8 THEN NULL ELSE Number END
Run Code Online (Sandbox Code Playgroud)

查询将如下所示:

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;
Run Code Online (Sandbox Code Playgroud)

输出:

ID 最大数量 最小编号
1 7 3

数据库小提琴