Нужно понять запрос в оракуле - PullRequest
0 голосов
/ 23 октября 2018
SELECT DISTINCT 'update loc_final_2 set county = ''' || TRIM(upper(county) ) || ''' 
    where city = '''
|| TRIM(upper(city) ) || ''' and state = ''' || TRIM(upper(state) ) || ''';'
FROM audtr_rgn_assgnmnts; 
commit

Может кто-нибудь сказать мне, что делает вышеуказанный запрос.Есть таблица с именем loc_final_2 и еще одна с именем audtr_rgn_assgnmnts.Я не понимаю, что делает запрос, и мне нужно улучшить этот запрос.Но перед этим я должен понять, что он делает.Мне также нужно знать, что делает коммит в конце.

1 Ответ

0 голосов
/ 23 октября 2018

Запрос пытается сгенерировать несколько операторов обновления для таблицы loc_final_2, используя значения из audtr_rgn_assgnmnts.Я не уверен, почему commit существует там, поскольку запросы не выполняются.

Если вообще исходным кодером запроса было запустить несколько обновлений, то я бы сказал, что этонеправильный подход.Одно обновление / MERGE, подобное этому, было бы более простым и производительным.

UPDATE loc_final_2 l
SET
     county = (
          SELECT upper(TRIM(county) ) --Add MIN/MAX if there are multiple rows 
          FROM audtr_rgn_assgnmnts a
          WHERE l.city = upper(TRIM(a.city) ) AND l.state = upper(TRIM(a.state) )
     );


MERGE INTO loc_final_2 t USING audtr_rgn_assgnmnts s ON (
     l.city = upper(TRIM(a.city) ) AND l.state = upper(TRIM(a.state) )
)
WHEN MATCHED THEN UPDATE SET t.county = UPPER(TRIM(s.county));

Если имеется несколько строк, вам нужно будет сделать выборку в USING

MERGE INTO loc_final_2 t USING (
     SELECT DISTINCT city,
                     state,
                     upper(TRIM(s.county) ) AS county
     FROM audtr_rgn_assgnmnts
)
s ON (
     l.city = upper(TRIM(a.city) ) AND l.state = upper(TRIM(a.state) )
)
WHEN MATCHED THEN UPDATE SET t.county = s.county;

РЕДАКТИРОВАТЬ :

что делает в запросе 3-одиночная кавычка

Буквенную кавычку в Oracle нужно экранировать, используя другуюцитаты.Итак, если в вашем последнем запросе должно быть что-то вроде a='b', выражение, генерирующее эту строку, должно быть a=||'''b||''' одна сама по себе, одна кавычка для экранирования этой кавычки, другая часть конкатенации.

потому что мин / макс можно использовать только для чисел, верно?

MAX и MIN можно использовать для строк.Здесь я сказал, что вы можете использовать его, чтобы избежать повторяющихся значений для того же округа, возвращенных из внутреннего запроса.DISTINCT также вариант, если вы не хотите использовать MIN/MAX.

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