LINUX.ORG.RU

SQL запросик.


0

0

Тут для офисных нужд понадобилось. Повтыкал в базу и сообразил такой вот запросик:

SELECT TBL1.IDN, TBL1.PDATEN, (TBL1.TOTAL - TBL2.TOTAL) AS TOTAL
FROM [
    SELECT LAST(ID) AS IDN, LAST(PDATE) AS PDATEN, SUM(OUTRUR + OUTCUR) AS TOTAL
    FROM Balance
    WHERE
        TYPE = 'A' AND (
        ACCOUNT LIKE "319*" OR
        ACCOUNT LIKE "320*" OR
        ACCOUNT LIKE "321*" OR
        ACCOUNT LIKE "322*" OR
        ACCOUNT LIKE "323*" OR
        ACCOUNT = 80000 ) OR
        ACCOUNT = 80000
    GROUP BY ID, PDATE
]. AS TBL1 INNER JOIN [
    SELECT LAST(ID) AS IDN, LAST(PDATE) AS PDATEN, SUM(OUTRUR + OUTCUR) AS TOTAL
    FROM Balance
    WHERE
        ACCOUNT = 80000
    GROUP BY ID, PDATE
]. AS TBL2 ON (TBL1.PDATEN = TBL2.PDATEN) AND (TBL1.IDN        = TBL2.IDN);

Ну и работало вроде замечательно. Это MS ACCESS естественно. 
Но со временем база пухла и пухла и сейчас уже стали доставать с тем, что тормозит. 
Проверил - действительно, на 100к записях порядка 10 секунд думает. Решил перевести всю базу на firebird. 
Но вот не могу перестроить запросы. Никак не соображу как он с вложенными select работает. Я далеко не DBA, потому прошу помочь.
★★★★★

Ответ на: комментарий от anonymous

Дело не в синтаксисе, firebird не переваривает саму конструкцию. Сейчас пробую сделать что-то похожее с помощью union, но тут опять же требуется основная таблица.

Anoxemian ★★★★★
() автор топика
Ответ на: комментарий от svr69

Для моей задачи view - не вариант. Т.к. самих запросов с различными счетами порядка 50. По 2 вьюхи на каждый. При том в каждой вьюхе свой набор счетом. ИМХО в данном случае создавать view - плодить лишние сущности.

По поводу сабжа. Вопрос решён при помощи SELECT var1, var2, (case when....)

Просто пришлось немного переделать вызывающий API. Но вот отсутствие вложенных запросов даже в стандарте (поправьте, если ошибаюсь) застявляет удивляться.

Anoxemian ★★★★★
() автор топика
Ответ на: комментарий от Anoxemian

Насколько я понимаю, вложенные запросы - это либо безумно дорого (если не оптимизировать), либо нужна мудрая оптимизация - изготовители простеньких баз могут не заморачиваться. ЕМНИП, минисиквел в свое время не умел их ваще.

svu ★★★★★
()

PostgreSQL по идее проглотит с небольшой переделкой.

saper ★★★★★
()

В firebird ещё есть хранимые процедуры (stored procedures). В них можно передавать параметры. SELECT как с таблицами.

SELECT <col_list> from name ([param [, param &#8230;]]) WHERE <search_condition> ORDER BY <order_list>;

name - имя хранимой процедуры.

koolig
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.