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)
各地更新,但结果是一样的。
我究竟做错了什么?正确更新第二个表的最佳方法是什么?
对于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 |
| 归档时间: |
|
| 查看次数: |
3550 次 |
| 最近记录: |