powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подзапросы в секции FROM
17 сообщений из 17, страница 1 из 1
Подзапросы в секции FROM
    #32484975
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Раньше работал с Sybase SQL Anywhere (помоему я уже это писал ;) и пользовался там отличной фичей:

select Table1.Col1, ... from (select ...) as Table1(Col1, Col2), ...

Очень хоцицца на Firebird такое поюзать. В принципе это реализуется с помощью view, но есть проблемы - create view требует обязательного завершения транзакции прежде чем его использовать, что является неприемлимым. Буду благодарен за ответ в виде подсказки как выйти из положения или может такую фичу включат в следующих релизах Firebird?
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32484979
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе, это реализуется иногда с помощью join...

а на sybase вы тоже налету вьюхи создавали?
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32484992
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"в принципе, это реализуется иногда с помощью join..."

К сожалению есть запросы в которых join абсолютно бесполезен.

"а на sybase вы тоже налету вьюхи создавали?"

Там не надо этого делать! - он поддерживает подселекты прямо в секции from.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485000
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторК сожалению есть запросы в которых join абсолютно бесполезен.
Есть. Но не так уж часто они встречаются.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485032
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Есть. Но не так уж часто они встречаются."

Если БД состоит из пяти таблиц то и не встречаются. У нас огромный проект (>500 таблиц, >70Mb исполняемого кода, >600 отчетов получаемых с помощью ~6000 запросов). Так вот если хотя бы 1% из этого требут такие подзапросы получаем капец.
Кроме того, эта фича на самом деле не отличается от уже реализованного механизма view. Просто надо научить его создавать (и уничтажать) временные view. Было бы круто!

А вообще хотелось бы перейти на Firebird, но из-за этих двух недостатков слишком много усилий потребуется.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485047
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас в базе 670 таблиц и 985 процедур. И обходимся.
Покажи свои многострадальные вопросы. Мож общественность чего и подскажет.
Оно понятно, когда привыкаешь к SELECT FROM (SELECT ...), то JOIN кажется убогим. Но это не совсем так.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485220
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая проблема частично решается использованием ХП. Причем соединение с ХП идет через ее параметр.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485242
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гмм, привести запросы не могу (боюсь любой из них заспамит весь форум, да и разобратьса в нем без базы и таких размеров запроса будет невозможно). Делать такие запросы мы начали не из-за хорошей жизни, и используем мы их только в случае крайней необходимости (когда основной запрос полностью выходит из под контроля из-за размеров и сложности для понимания).

И еще одна причина применение данных подзапросов:

Изначально база затачивалась под Sybase и репортер (чтоб он был здоров) был сделан на базе получения отчетов исключительно запросами (генерируемых автоматом исходя из дизайна и требуемых данных отчетов). Даже я бы сказал в результате на основе одного запроса полностью получается весь отчет. Переделать все наработки не представляется возможным. Я попытался сделать препарсер, разбивающий запрос на несколько частей (включая создание view), но пока все уперлось в стенку, из-за необходимости делать commit после обновления метаданных... Обидно, да!
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485248
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Такая проблема частично решается использованием ХП. Причем соединение с ХП идет через ее параметр."

Непонял. Как можно применять ХП без процедур?
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485254
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Firebird 1.5 проблему можно решить так (только не говорите, что я извращенец). Допутим есть такой запрос (за синтаксис извините, не помню):

Код: plaintext
1.
SELECT * FROM (SELECT F_ID, COUNT(*) FROM TABLE2)
CT INNER JOIN TABLE1 T on (CT.F_ID=T.ID) 


Таким образом, например, можно подсчитать кол-во master записей в detail таблице.
Создаем процедуру

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE GET_COUNT_FROM_VARCHAR(STR_SQL VARCHAR( 16000 ))
RETURNS(CNT INTEGER)
AS
BEGIN
  EXECUTE STATEMENT  STR_SQL INTO :CNT;
  SUSPEND;
END


И выполняем запрос:
SELECT * FROM TABLE1 T LEFT JOIN
GET_COUNT_FROM_VARCHAR('SELECT COUNT(*) FROM TABLE2 WHERE F_ID=' ||
T.ID ) ON (1=1)
Получаем тот же результат, только со всеми master записями.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485267
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению этим проблема не решается - абсолютно то-же самое получается с помощью View, а create procedure является также изменением метаданных базы и в запросе сработает только после commit.
Всем спасибо за помощь, видимо у нас в будующем ожидает тяжкая судьба переписывания запросов.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485276
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Stressman.
Ты не понял просто, о чем я говорю. В ХП можно выполнить любой запрос представленный строкой и не надо метаданные менять.
Приведу пример попроще.

Запрос вида:

Код: plaintext
select Table1.Col1  from (select ...) as Table1(Col1)


Можно заменить таким образом.
Создаешь процедуру с максимально необходимым кол-вом столбцов опреденных типов(можно все VARCHAR, а потом преобразовывать).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE PROCEDURE 
GET_SEL_FROM_VARCHAR(STR_SQL VARCHAR( 16000 ))

RETURNS(CNT INTEGER)
RETURNS(VC VARCHAR( 255 ))

AS

BEGIN

EXECUTE STATEMENT  STR_SQL INTO :CNT, :VC;

  SUSPEND;

END


Ну а дальше формируешь, например, такую строку:
Код: plaintext
strSql:=SELECT  0 , Col1 FROM Table1;

(0 - здесь для соответствия параметров)
и выполняешь запрос типа:
Код: plaintext
1.
SELECT VC  FROM GET_SEL_FROM_VARCHAR(:strSql)
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485277
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедуру не так написал. Надо так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE PROCEDURE 

GET_SEL_FROM_VARCHAR(STR_SQL VARCHAR( 16000 ))

RETURNS(CNT INTEGER)

RETURNS(VC VARCHAR( 255 ))

AS

BEGIN

FOR EXECUTE STATEMENT  STR_SQL INTO :CNT, :VC DO

  SUSPEND;

END
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485294
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FreemanZAV, интересно и оригинально! Сейчас попробую (благо тестики имеются) и о результатах сообщу.
Спасибо.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32485329
Stressman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал - сработало!!
Каковы ньюансы:
1. Геморрой с количеством параметров (и соотвественно полей в подзапросе - хотя конечно поможет создать процедуры на 1, 2, 3... параметров).
2. Геморрой с преобразованием типов параметров - либо точное совпадение либо сам туду-сюда преобразовывай. При преобразовании могут возникнуть проблемы с оптимизацией!
3. Оптимизация исполнения запроса. Есть подозрение, особенно при применении преобразования типов, может упасть скорость выполнения запроса относительно тех-же View (все таки View, как я понимаю механику, оптимизируется и выполняется не отдельно, а в совокупности с основным запросом - про процедуры ничего сказать немогу). Хотя радует то что скорость исполнения в двух вариантах моего теста была практически одинаковая!

Если кто выскажется по этим пункта (рекомендации, советы или знания в области схем оптимизации Firebird) было бы клево. Заранее благодарен.
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32493966
Vladimir Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,

В Firebird-овской конфе сказали, что эта фича будет в FB2.0

С уважением
Владимир Борзов
...
Рейтинг: 0 / 0
Подзапросы в секции FROM
    #32493985
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Borzov В Firebird-овской конфе сказали, что эта фича будет в FB2.0
Года через два.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подзапросы в секции FROM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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