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

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

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

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

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

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

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

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

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

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

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

Непонял. Как можно применять ХП без процедур?
...
Рейтинг: 0 / 0
17.04.2004, 11:12
    #32485254
FreemanZAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапросы в секции FROM
В 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
17.04.2004, 12:04
    #32485267
Stressman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапросы в секции FROM
К сожалению этим проблема не решается - абсолютно то-же самое получается с помощью View, а create procedure является также изменением метаданных базы и в запросе сработает только после commit.
Всем спасибо за помощь, видимо у нас в будующем ожидает тяжкая судьба переписывания запросов.
...
Рейтинг: 0 / 0
17.04.2004, 12:27
    #32485276
FreemanZAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапросы в секции FROM
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
17.04.2004, 12:29
    #32485277
FreemanZAV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапросы в секции FROM
Процедуру не так написал. Надо так:
Код: 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
17.04.2004, 12:57
    #32485294
Stressman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапросы в секции FROM
FreemanZAV, интересно и оригинально! Сейчас попробую (благо тестики имеются) и о результатах сообщу.
Спасибо.
...
Рейтинг: 0 / 0
17.04.2004, 14:52
    #32485329
Stressman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапросы в секции FROM
Попробовал - сработало!!
Каковы ньюансы:
1. Геморрой с количеством параметров (и соотвественно полей в подзапросе - хотя конечно поможет создать процедуры на 1, 2, 3... параметров).
2. Геморрой с преобразованием типов параметров - либо точное совпадение либо сам туду-сюда преобразовывай. При преобразовании могут возникнуть проблемы с оптимизацией!
3. Оптимизация исполнения запроса. Есть подозрение, особенно при применении преобразования типов, может упасть скорость выполнения запроса относительно тех-же View (все таки View, как я понимаю механику, оптимизируется и выполняется не отдельно, а в совокупности с основным запросом - про процедуры ничего сказать немогу). Хотя радует то что скорость исполнения в двух вариантах моего теста была практически одинаковая!

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

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

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


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