Как реализовать Обновление подзапроса в sql server 2017 Я хочу обновить один столбец, используя множественный выбор, но в нем отображается ошибка подзапроса. - PullRequest
0 голосов
/ 20 февраля 2020
UPDATE temp_hourly_stats SET peak_location_percentage =( 
(SELECT TOP(1) peak_location_count as peak_location_count FROM temp_hourly_stats where time_range = (select concat( DATEPART(hh, DATEADD(hh,-1,CURRENT_TIMESTAMP)) ,'-', DATEPART(hh, CURRENT_TIMESTAMP))as time_range) order by id desc)UNION
(SELECT TOP(1) total_count as total_count FROM temp_hourly_stats where time_range = (select concat( DATEPART(hh, DATEADD(hh,-1,CURRENT_TIMESTAMP)) ,'-', DATEPART(hh, CURRENT_TIMESTAMP))as time_range) order by id desc)Union
(select (peak_location_count*100)/total_count as peak_loc_percentage))

Я получаю следующую ошибку: - Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Ваш подзапрос имеет 2 UNION, поэтому он возвращает 3 записи. Так вот почему вы получаете ошибку. Есть несколько способов обработать ваш запрос. Попробуйте что-то вроде этого:

  UPDATE temp_hourly_stats
SET         temp_hourly_stats.peak_location_percentage = ( CA1.peak_location_count * 100 ) / CA2.total_count
FROM        temp_hourly_stats
CROSS APPLY 
            (
                     SELECT TOP(1)
                              peak_location_count AS peak_location_count
                     FROM     temp_hourly_stats
                     WHERE    time_range =
                              (
                                     SELECT concat( Datepart(hh, Dateadd(hh,-1,CURRENT_TIMESTAMP)) ,'-', Datepart(hh, CURRENT_TIMESTAMP))AS time_range)
                     ORDER BY id DESC ) AS CA1
CROSS APPLY
            (
                     SELECT TOP(1)
                              total_count AS total_count
                     FROM     temp_hourly_stats
                     WHERE    time_range =
                              (
                                     SELECT concat( Datepart(hh, Dateadd(hh,-1,CURRENT_TIMESTAMP)) ,'-', Datepart(hh, CURRENT_TIMESTAMP))AS time_range)
                     ORDER BY id DESC ) AS CA2 
0 голосов
/ 20 февраля 2020

Можете ли вы использовать оператор IN вместо оператора "=" в запросе на обновление.

Примерно так:

UPDATE temp_hourly_stats SET peak_location_percentage IN ((ВЫБРАТЬ ТОП (1) peak_location_count как peak_location_count FROM temp_hourly_stats где time_range = (выберите concat (порядок DATEPART (чч, DATEADD (чч, -1, CURRENT_TIMESTAMP)), '-', DATEPART (чч, CURRENT_TIMESTAMP)) в качестве временного диапазона по идентификатору des c) UNION (SELECT TOP (1 ) total_count как total_count FROM temp_hourly_stats где time_range = (выберите concat (DATEPART (чч, DATEADD (чч, -1, CURRENT_TIMESTAMP)), '-', DATEPART (чч, CURRENT_TIMESTAMP)) в качестве time_range упорядочить по id des c Объединение (выберите (peak_location_count * 100) / total_count как peak_loc_percentage))

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