Как обстоят дела там, где состояние SQL Server? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь создать пакетное обновление своих данных с фильтром даты.

   below is my sample table[myTable] data:
   +--------+------------+-----------+
   |   ID   |    Amount  |  ResetDay |  
   +--------+------------+-----------+
   |   1    |    100     |     1     |
   +--------+------------+-----------+
   |   2    |    100     |     2     |
   +--------+------------+-----------+
   |   3    |    100     |     29    |
   +--------+------------+-----------+
   |   4    |    100     |     30    |
   +--------+------------+-----------+

Вот мой запрос:

   update myTable set Amount = 0
   where ID in (case when ResetDay > day(eomonth(getdate()))
   then (select ID from myTable where ResetDay > day(eomonth(getdate())))
   else (select ID from myTable where ResetDay = day(getdate()))) end) 

У меня автоматическое пакетное обновление с триггером даты,Я использую условия, что когда ResetDay больше, чем в конце месяца, он обновит все данные, которые имеют ResetDay.и если нет, обновятся только данные, равные дате.

Пример запроса и ожидаемый результат: Запрос: (Это для выборки дня окончания месяца меньше, чем ResetDay)

  update myTable set Amount = 0
  where ID in (case when ResetDay > 28
  then (select ID from myTable where ResetDay > 28)
  else (select ID from myTable where ResetDay = 1) end) 

  Output:
   +--------+------------+-----------+
   |   ID   |    Amount  |  ResetDay |  
   +--------+------------+-----------+
   |   1    |    100     |     1     |
   +--------+------------+-----------+
   |   2    |    100     |     2     |
   +--------+------------+-----------+
   |   3    |    0       |     29    |
   +--------+------------+-----------+
   |   4    |    0       |     30    |
   +--------+------------+-----------+

Как обстоит дело, где состояние SQL Server?Как я получаю сообщение об ошибке при выполнении этих запросов Subquery returned more than 1 value, This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

1 Ответ

3 голосов
/ 19 июня 2019

Ваш запрос по сути является самостоятельным.Хотя это вообще не нужно и, похоже, является результатом попытки использовать CASE, когда это не нужно.

тот же самый запрос может быть переписан как:

update myTable 
set Amount = 0
where (ResetDay > day(eomonth(getdate())) and ResetDay > day(eomonth(getdate())))
     OR (ResetDay <= day(eomonth(getdate())) and ResetDay = day(getdate())))

Я даже не пытаюсь сосчитать скобки здесь, эти формулы не должны быть в запросе.Более понятный способ написать это:

declare @eomday int=day(eomonth(getdate())), @today int =day(getdate());

update myTable 
set Amount = 0
where (ResetDay > @eomday and ResetDay > @eomday)
     OR (ResetDay <= @eomday and ResetDay = @today)

Очевидно, что условия не верны.Первая пара является дубликатом, а вторая эквивалентна просто ResetDay=@today, поскольку день текущего месяца всегда будет больше или равен сегодняшнему.

Запрос можно переписать как:

update myTable 
set Amount = 0
where ResetDay > @eomday 
     OR ResetDay = @today

Этот запрос говорит то же самое, что и ваше требование:

, когда ResetDay больше, чем день конца месяца, он обновит все данные с большим ResetDay.и если нет, он обновит только те данные, которые равны дате.

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