【问题标题】:SQL Update where select top(num)SQL Update where select top(number)
【发布时间】:2020-01-25 17:57:20
【问题描述】:

我想根据子查询是否返回 4 条记录来更新同一个表中的列。

这是表结构

Id      Form    Quantity    Transitdays percentUnderQty percentOverQty
192     0       15500       5           13950           17050
193     0       1250        5           1125            1375
194     0       5000        5           4500            5500
195     0       12500       4           11250           13750
196     0       164250      3           147825          180675
197     0       5250        3           4725            5775
198     0       6250        3           5625            6875
199     0       12250       3           11025           13475
200     0       1750        2           1575            1925
201     0       17000       2           15300           18700
202     0       2500        2           2250            2750
203     0       11500       2           10350           12650
204     0       1250        1           1125            1375

这是我迄今为止的尝试。该语句正在更新所有记录,而不仅仅是基于子查询的特定记录。

UPDATE Temp_Runlist
SET Form = (
  SELECT MAX(Quantity) + 1 AS Form
  FROM Temp_Runlist AS t2
)
WHERE EXISTS (
  SELECT TOP (4) Quantity
  FROM Temp_Runlist AS t1
  WHERE (Quantity BETWEEN 1125 AND 1375) AND (Form = 0)
)

逻辑解释: 我将遍历每个数量并调用此查询。查询应该使用从 1 开始的值更新 Form 列。在下面的查询示例中,结果应该是查询不会更新表单,因为子查询只找到 2 个匹配的记录。如果子查询返回 4 条记录,那么这 4 条记录的 Form 列将为 1。在下一次传递时,如果只有子查询返回四个匹配项,则 form 将为 2。

【问题讨论】:

  • 请说明您要实现的逻辑。显然,您的查询不正确,它正在执行您指定的操作,并且您的解释不清楚。如果子查询返回少于 4 条记录怎么办?显示您想要的结果也会有所帮助。

标签: sql sql-server select subquery


【解决方案1】:

也许有更好的方法,但我认为使用临时表来保存要更新的 id 并使用多个语句是最简单的。例如:

WITH CTE AS (
    SELECT TOP (4) Id
    FROM Temp_Runlist AS t1
    WHERE (Quantity BETWEEN 1125 AND 1375) AND (Form = 0)
)
SELECT Id INTO #tmpIDs FROM CTE;
GO

IF (SELECT COUNT(Id) FROM #tmpIDs) = 4
BEGIN
    UPDATE Temp_Runlist
    SET Form = (
      SELECT MAX(Form) + 1 AS Form
      FROM Temp_Runlist AS t2
    )
    WHERE Id IN (SELECT Id FROM #tmpIDs)
END;
GO

DROP TABLE #tmpIDs
GO

CTE 收集您想要的记录。
IF 检查是否实际上有 4 条记录。
然后 UPDATE 使用 Ids 的临时表进行限制。

顺便说一句 - 你的例子有 MAX(Quantity),而它看起来应该是 MAX(Form)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多