Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> select top 50 percent, Firebird 2.5 
:(
    Опции темы
tishaishii
Дата 7.7.2011, 10:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Как выполнить запрос: 
Код
select top 50 percent id from t1
 ?
PM MAIL ICQ Skype   Вверх
FMA
Дата 7.7.2011, 12:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



Код

select first 50 id from t1

не подойдет?
PM MAIL   Вверх
tishaishii
Дата 9.7.2011, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



В MSACCESS, по-моему, наряду с возможностью указания абсолютной мощности выборки, есть возможность указать относительную.
"50 percent" - это половина.
PM MAIL ICQ Skype   Вверх
Akella
Дата 9.7.2011, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Подойдёт ли так?
Код

execute BLOCK RETURNS (id integer)
as
DECLARE VARIABLE a INTEGER;
DECLARE VARIABLE b INTEGER;
begin
  select count(id) id from apart into :a;
  b = a/2;

  for select first (:b) id from apart into :id
  do
  SUSPEND;
end


По другому не знаю как :(, попробуй задай вопрос на SQL.RU

Добавлено через 1 минуту и 55 секунд
С входящим параметром

Код

execute BLOCK (p1 integer = :p1)
RETURNS (id integer)
as
DECLARE VARIABLE a INTEGER;
DECLARE VARIABLE b INTEGER;
begin
  select count(id) id from apart into :a;
  b = a/p1;

  for select first (:b) id from apart into :id
  do
  SUSPEND;
end

PM MAIL   Вверх
tishaishii
Дата 14.7.2011, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Есть много запросов, в них много разных связанных отношений и условий. Нет желания описывать каждый запрос в качестве блока или процедуры. Хотелось сократить код и не использовать составление запроса "на лету".

Это сообщение отредактировал(а) tishaishii - 14.7.2011, 22:03
PM MAIL ICQ Skype   Вверх
password
Дата 14.7.2011, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: нет
Всего: 8



А нельзя упростить так:
Код

select first ((select count(*) from t1)*0.5) id from  t1


Это сообщение отредактировал(а) password - 14.7.2011, 22:13
PM MAIL Skype   Вверх
tishaishii
Дата 14.8.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Не подойдёт.
В задаче есть много (около 1000) разных запросов, которые часто изменяются (выгрузка информации для справочного печатного издания).
Хочется как-то упростить их.

Сейчас, у меня это делается с помощью парсера. Строка вида
Код

0.5       t1 as t11 inner join t2 on ....... inner join t1 as t12 on ......... where .......... order by .....


разбивается и выполняются два запроса с ?COUNT=count(*) и ?PERCENT=0.5.
Т.е.

Код
select count(*) as "COUNT" from t1 as t11 inner join t2 on ....... inner join t1 as t12 on ......... where .......... into ?"COUNT";
select first (?"COUNT" * ?"PERCENT") * from t1 as t11 inner join t2 on ....... inner join t1 as t12 on ......... where .......... order by .....


Может быть, можно внутри SQL перед работой с курсором узнать сколько строк удастся выбрать? row_count что-то молчит.
PM MAIL ICQ Skype   Вверх
rodnover
Дата 14.8.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Не знаю, на сколько будет оптимизированно, но возможно, набор данных будет вычислять один раз, если сделать через 2 SP

Код

create or alter procedure QUERY_TABLES -- Требуется для нумерации строчек
returns(ID_ROW_NUM integer,
   ...)
declare ROW_NUM integer;
as
begin
    ROW_NUM = 1;
    for
        select :ROW_NUM, *
        from NEEDED_TABLES
        -- Сортировать в обратном нужному порядке
        into :ID_ROW_NUM, ....
    do
    begin
        suspend;
       ROW_NUM = :ROW_NUM + 1;
    end
end


Код

execute block
returns(...)
declare MAX_ROW integer;
as
begin
    MAX_ROW = null;
    for
        select *
        from QUERY_TABLES
        order by ID_ROW_NUM desc -- Начинаем с самой большой строки, содержит общее количество строк
        into :ID_ROW_NUM, .....
    do
    begin
         if MAX_ROW is null then
               MAX_ROW = ID_ROW_NUM / 2; -- Получаем ровно половину строк
         else if ID_ROW_NUM >= MAX_ROW then -- Выводим только большую первую половину
              suspend;
        else
             break;
    end
end


Завтра на работе попробую потестировать на больших данных. smile

Это сообщение отредактировал(а) rodnover - 14.8.2011, 20:43
PM MAIL   Вверх
tishaishii
Дата 14.8.2011, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



Спасибо за желание помочь, rodnover!
Думаю, всё-таки, сохранение каждого (из 1000-2000) отношения в БД - это нормальная практика.
Есть небольшой недостаток: при редактировании шаблона выгрузки, придётся дополнительно пересоздавать соответствующее отношение в БД. Возможно, в связи с этим, стоит подумать как описать в БД и сами шаблоны.

Для ясности. Для публикации информации из БД используется простой шаблонизатор с множеством блоков (1000-2000, "по погоде") вида:
Код
ЗАГОЛОВОК

ТЕЛО

ЗАПРОС


Моим вариантом решения будет для каждого запроса создавать процедуру (for ЗАПРОС into ... do suspend) с именем вида "PUB_{sha1_hex(ЗАПРОС)}".
Вопрос открыт.

Это сообщение отредактировал(а) tishaishii - 14.8.2011, 22:07
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.