powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / SQL запрос на UPDATE с SELECt и HAVING MAX(date)
8 сообщений из 8, страница 1 из 1
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39253826
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно пометить как не активными Организации у которых не было пол года движения.
Сам запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE organisations SET isarchive='f'
WHERE id in 
(
 SELECT receiverid AS id, MAX(date_) AS max
 FROM payments
 GROUP BY receiverid
 HAVING MAX(date_)<=TO_DATE("2016-01-01", "%Y-%m-%d")
) 


Ошибка в:
SELECT receiverid, MAX(date_)
Если убираю MAX(date_) вложенный запрос отрабатывает не корректно.
Подскажите как быть?
...
Рейтинг: 0 / 0
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39253920
SQL терпит много издевательств над синтасисом типа

SELECT SELECT FROM FROM WHERE WHERE = FROM


но что-то смущает меня использование ключевого слова max как алиаса колонки

SELECT receiverid AS id, MAX(date_) AS max
...
Рейтинг: 0 / 0
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39254161
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
/*
CREATE TEMP TABLE organisations (id INT, isarchive BOOLEAN) WITH NO LOG;
CREATE TEMP TABLE payments (receiverid INT, date_ DATE) WITH NO LOG;
*/

UPDATE organisations
   SET isarchive = 'f'
 WHERE id IN (SELECT id
               FROM (SELECT receiverid AS id
                           ,MAX(date_) AS max
                      FROM payments
                     GROUP BY receiverid
                    HAVING MAX(date_) <= TO_DATE("2016-01-01", "%Y-%m-%d"))
 );
...
Рейтинг: 0 / 0
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39254201
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Яковлев ПавелSQL терпит много издевательств над синтасисом,
но что-то смущает меня использование ключевого слова max как алиаса колонки

Здесь вопрос не в синтаксисе. Синтаксис такого запроса будет практически одинаков во всех современных движках СУБД.
В этом запросе я вижу две потенциальных проблемы в случае, если таких организаций окажется достаточно много.
Возможна длинная транзакция

Возможно существенное замедление выполнения запроса, поскольку внутренний подзапрос почти всегда использует неявное создание временной таблицы без индексов.

В этом случае можно предложить что-то типа:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
DROP TABLE IF EXISTS tmptb;

 SELECT id
  FROM (SELECT receiverid AS id
              ,MAX(date_) AS max
         FROM payments
        GROUP BY receiverid
       HAVING MAX(date_) <= TO_DATE("2016-01-01", "%Y-%m-%d"))
INTO TEMP tmptb WITH NO LOG;

CREATE UNIQUE INDEX i_tmptb ON tmptb (id);

DROP PROCEDURE IF EXISTS tmpproc;
CREATE PROCEDURE tmpproc()
 DEFINE p_id INT;
 FOREACH WITH HOLD
  SELECT id
    INTO p_id
    FROM tmptb
  UPDATE organisations
     SET isarchive = 'f'
   WHERE id == p_id;
 END FOREACH;
END PROCEDURE;

EXECUTE PROCEDURE tmpproc();
DROP PROCEDURE tmpproc;
DROP TABLE tmptb;
...
Рейтинг: 0 / 0
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39254505
victor16Яковлев ПавелSQL терпит много издевательств над синтасисом,
но что-то смущает меня использование ключевого слова max как алиаса колонки

Здесь вопрос не в синтаксисе.

Мда ? Интересное альтернативное прочтение темы.

А что нам автор скажет про загадочное "Ошибка в" ? Что за ошибка-то ?
...
Рейтинг: 0 / 0
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39255410
potkin,

используй NOT EXISTS
...
Рейтинг: 0 / 0
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39255411
Яковлев ПавелЧто за ошибка-то ?а сам не понимаешь? автор одиночное "скалярное" значение пытается сравнивать с "векторной" парой IN-подзапроса. уж если сравниваем одно значение, то IN-подзапрос и вовращать должен один столбец, а не два...
...
Рейтинг: 0 / 0
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
    #39256420
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо!
Вопрос был просто в SQL-запросе, тупанул что-то я ...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / SQL запрос на UPDATE с SELECt и HAVING MAX(date)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]