Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написать странный запрос с update 
:(
    Опции темы
polin11
Дата 15.2.2024, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Использую PGSQL, упрощенный запрос выглядит так
Код

 WITH a
         AS ( SELECT DISTINCT UNNEST(ARRAY['777', NULL]) "Ключ",
         UNNEST(ARRAY['111', '222']) "Знач"
         )
 update "Документы"
 set "Название" = "Название" || '_' || a."Знач"
 FROM a
 where "Id" IS NOT DISTINCT FROM  a."Ключ"
returning *

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

Код

WITH a
         AS ( SELECT DISTINCT UNNEST(ARRAY['777', NULL]) "Ключ",
         UNNEST(ARRAY['333', '444']) "Знач"
         )
 update "Документы"
 set "Название" = "Название" || '_' || a."Знач"
 FROM a
 where
   EXISTS (
    SELECT TRUE
    FROM a
    WHERE "Id" = a."Ключ" and "Id" IS NOT NULL and a."Ключ" IS NOT NULL  
    UNION
     SELECT TRUE
    FROM a
    WHERE "Id" IS NULL and a."Ключ" IS NULL
   )
returning *

этот запрос неверно определяет Знач, для своего Ключа.
Как написать подобный запрос, если не прибегать к CTE?
PM MAIL   Вверх
Akina
Дата 15.2.2024, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



Цитата(polin11 @  15.2.2024,  09:34 Найти цитируемый пост)
этот запрос неверно определяет Знач, для своего Ключа

Вот скажи мне - когда ты в подзапросе пишешь WHERE "Id" = a."Ключ", откуда, по-твоему, возьмётся значение для a."Ключ" - из таблицы подзапроса или из таблицы внешнего запроса? у тебя и там, и там FROM a

Затверди правило - если в запросе участвует более одной таблицы, то ЛЮБАЯ таблица должна иметь УНИКАЛЬНЫЙ в пределах всего запроса алиас, и ЛЮБОЕ имя поля должно включать этот алиас (ну кроме полей обновляемой таблицы, конечно, ибо синтаксис).

Хотя как по мне - запрос какой-то жестоко-бессмысленный. Сделай нормальный набор скриптов создания и наполнения исходных таблиц, что ли... и сформулируй собственно задачу, но уже предметно. Запрос, его план, что не устраивает, что хочется получить...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
polin11
Дата 15.2.2024, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Цитата(Akina @ 15.2.2024,  09:22)
Цитата(polin11 @  15.2.2024,  09:34 Найти цитируемый пост)
этот запрос неверно определяет Знач, для своего Ключа

Вот скажи мне - когда ты в подзапросе пишешь WHERE "Id" = a."Ключ", откуда, по-твоему, возьмётся значение для a."Ключ" - из таблицы подзапроса или из таблицы внешнего запроса? у тебя и там, и там FROM a

Затверди правило - если в запросе участвует более одной таблицы, то ЛЮБАЯ таблица должна иметь УНИКАЛЬНЫЙ в пределах всего запроса алиас, и ЛЮБОЕ имя поля должно включать этот алиас (ну кроме полей обновляемой таблицы, конечно, ибо синтаксис).

Хотя как по мне - запрос какой-то жестоко-бессмысленный. Сделай нормальный набор скриптов создания и наполнения исходных таблиц, что ли... и сформулируй собственно задачу, но уже предметно. Запрос, его план, что не устраивает, что хочется получить...

не совсем понял как алиас таблицы в подзапросе поможет решить проблему? 
PM MAIL   Вверх
Akina
Дата 15.2.2024, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



Должно быть

Код

WITH a
         AS ( SELECT DISTINCT UNNEST(ARRAY['777', NULL]) "Ключ",
         UNNEST(ARRAY['333', '444']) "Знач"
         )
 update "Документы"
 set "Название" = "Название" || '_' || {alias 1}."Знач"
 FROM a AS {alias 1}
 where
   EXISTS (
    SELECT TRUE
    FROM a AS {alias 2}
    WHERE "Id" =  {alias ?}."Ключ" and "Id" IS NOT NULL and  {alias ?}."Ключ" IS NOT NULL  
    UNION
     SELECT TRUE
    FROM a AS {alias 3}
    WHERE "Id" IS NULL and  {alias ?}."Ключ" IS NULL
   )
returning *


Тогда хотя бы станет понятна заложенная в запрос логика. С учётом того, что WHERE EXISTS обычно коррелированный, в подзапросе, вероятно, должны быть {alias 1}...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.1223 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.