Обновление SQL, где выберите top (num) - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу обновить столбец в той же таблице, основываясь на том, что подзапросом возвращено 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. В приведенном ниже примере запроса результат должен быть таким, что запрос не будет обновлять форму, поскольку подзапрос обнаружил только 2 совпадающие записи.Если подзапрос вернул 4 записи, столбец Form этих 4 записей будет равен 1. При следующем проходе форма будет 2, если только подзапрос вернет четыре совпадения.

1 Ответ

1 голос
/ 25 сентября 2019

Может быть, есть лучший способ, но я думаю, что было бы проще использовать временную таблицу для хранения идентификаторов, которые вы хотите обновить, и использовать более одного оператора.Например:

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 использует темптаблица идентификаторов для ограничения.

Кстати - в вашем примере было MAX (количество), когда похоже, что оно должно быть MAX (форма).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...