Как обновить запись таблицы сервера Sql в состоянии соответствия цикла? - PullRequest
0 голосов
/ 25 апреля 2019

Я обеспокоен тем, что если запрос на обновление пойдет не так, это повлияет на всю таблицу.

Я пишу здесь запрос, чтобы показать, какие данные у меня есть и как мне придется их обновлять,

SELECT BuildingId,VisitNumber,Id,TasksId,Status,GregorianDate
FROM Visit where status=5 and BuildingId in (7,8,9,10)
Group by BuildingId,Id,TasksId,Status,VisitNumber,GregorianDate
order by BuildingId,GregorianDate asc

BuildingId  VisitNumber Id  TasksId Status  GregorianDate
7            Visit_U_1  169     79    5     2018-04-09
7            Visit_U_1  1217    506   5     2018-08-01
7            Visit_U_1  2162    775   5     2019-01-09
8            Visit_U_1  148     72    5     2018-04-10
8            Visit_U_1  2206    783   5     2019-01-08
9            Visit_U_1  161     76    5     2018-04-10
9            Visit_U_1  1175    489   5     2018-07-30
9            Visit_U_1  2128    770   5     2019-01-08

Как мы видим результаты запроса, необязательно, чтобы у нас было три записи для построения идентификатора, это может быть 3,4 или любое количество раз.Аналогично, GregorianDates не являются фиксированными.

Я хочу обновить последовательность VisitNumbr, как в случае BuildingId '7'.Его первое посещение должно быть «Visit_U_1», а второе - «Visit_U_2» и так далее в соответствии с GregorianDate.

Аналогично для здания «8».Снова номер посещения становится 'Visit_U_1', 'Visit_U_2' и т. Д. В соответствии с GregorianDate.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Полагаю, что столбец «GregorianDate» является типом данных DateTime. Если это так, этот следующий запрос будет служить вашей цели-

UPDATE V
SET    VisitNumber  = 'Visit_U_' + N
FROM   visit V
INNER JOIN (
    SELECT 
    BuildingId,
    GregorianDate,
    CAST(ROW_NUMBER() OVER(PARTITION BY BuildingID ORDER BY GregorianDate) AS VARCHAR) N
    FROM   visit
    WHERE  BuildingId IN (7, 8, 9,10)
    AND  status=5
) VN
ON  V. BuildingId = VN.BuildingId
AND V. GregorianDate = VN.GregorianDate
WHERE  V.BuildingId IN (7, 8, 9,10)
AND  V.status=5

Примечание. Чтобы сгенерировать row_number (), необходимо применить порядок по методу к полю GregorianDate. Меньшее значение в этом поле указывает на то, что номер посещения должен быть меньше по сравнению со следующей / более поздней датой посещения.

0 голосов
/ 25 апреля 2019

Вы можете справиться с этим, используя substring и row_number

Выберите запрос

вы хотите вывод, как показано ниже Visit_U_1,Visit_U_2, Visit_U_3 Поэтому я удаляю последнюю цифруиз столбца Vist и добавил его с помощью номера.Это делается с помощью функций Sunstring и row_number().Преобразуйте номер строки в nvarchar, чтобы устранить полученную ошибку.

 substring(VisitNumber,0,len(VisitNumber)-1) + convert(nvarchar(50), row_number()over (partition by BuildingID order by BuildingID) ) visit_new

-

SELECT BuildingId,VisitNumber,Id,TasksId,Status,GregorianDate,row_number()over (partition by BuildingID order by BuildingID)srno,
substring(VisitNumber,0,len(VisitNumber)-1) + row_number()over (partition by BuildingID order by BuildingID) visit_new
FROM Visit 
where status=5 
and BuildingId in (7,8,9,10)
Group by BuildingId,Id,TasksId,Status,VisitNumber,GregorianDate
order by BuildingId,GregorianDate asc

Запрос на обновление

Update Visit
set Visit.VisitNumber = a.visit_new
FROM Visit 
inner join (
            SELECT   BuildingId,VisitNumber,Id,TasksId,Status,GregorianDate,row_number()over (partition by BuildingID order by GregorianDate )srno,
                     substring(VisitNumber,0,len(VisitNumber)-1) + convert(nvarchar(50), row_number()over (partition by BuildingID order by GregorianDate) )
            FROM     Visit  
            where    status=5 
            and      BuildingId in (7,8,9,10)
) a on a.status = Visit.status and a.BuildingId = visit.BuildingId
where status=5 
and BuildingId in (7,8,9,10)

Проверьте этот код перед обновлением данных в реальном времени.

...