Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / SQL запрос на UPDATE с SELECt и HAVING MAX(date) / 8 сообщений из 8, страница 1 из 1
09.06.2016, 17:26
    #39253826
potkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
Нужно пометить как не активными Организации у которых не было пол года движения.
Сам запрос:
Код: 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
09.06.2016, 22:02
    #39253920
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
SQL терпит много издевательств над синтасисом типа

SELECT SELECT FROM FROM WHERE WHERE = FROM


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

SELECT receiverid AS id, MAX(date_) AS max
...
Рейтинг: 0 / 0
10.06.2016, 12:17
    #39254161
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
Код: 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
10.06.2016, 12:52
    #39254201
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
Яковлев Павел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
10.06.2016, 21:05
    #39254505
SQL запрос на UPDATE с SELECt и HAVING MAX(date)
victor16Яковлев ПавелSQL терпит много издевательств над синтасисом,
но что-то смущает меня использование ключевого слова max как алиаса колонки

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

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

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

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


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