Форум: "Базы";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизКак ограничить запрашиваемый SQL-набор в ADO Найти похожие ветки
← →
kaif © (2006-09-11 16:59) [0]В Firebird я могу написать:
select first 10 * from table1
В MySQL я могу написать:
select * limit 1,10 from table1
Как мне то же самое сделать через ADO, если я обращаюсь через FoxPro OLEDB Provider к таблице FoxPro?
Мне нужно выбрать, допустим, первые десять записей.
Таблица слишком большая.
В лоб не открывает. Ждет часами.
Кто подскажет синтаксис?
← →
kaif © (2006-09-11 17:12) [1]Блин, нашел вроде вариант в Transact-SQL:
select top(1) from table1 order by field1
Причем употребление top обязательно требует order by
И если неудачно выбрать поле (по которому нет индекса), то будет долго мучиться, похоже.
В общем, вопрос снят.
← →
MsGuns © (2006-09-11 17:54) [2]>kaif © (11.09.06 17:12) [1]
>Причем употребление top обязательно требует order by
Откуда дровишки ?
← →
kaif © (2006-09-11 21:49) [3]MsGuns © (11.09.06 17:54) [2]
>kaif © (11.09.06 17:12) [1]
>Причем употребление top обязательно требует order by
Откуда дровишки ?
OLE DB Provider сообщил что-то вроде:
command with "top" must have "order by" clause
Я бы сам не догадался до такой ерунды. :)
← →
Johnmen © (2006-09-11 22:48) [4]А я так думаю, что order by в данном случае очень даже логично. А вот без него просто ерунда...
← →
SergP © (2006-09-12 07:01) [5]Извиняюсь, но чтобы не создавать новую ветку, задам свой вопрос здесь:
> В Firebird я могу написать:
> select first 10 * from table1
> В MySQL я могу написать:
> select * limit 1,10 from table1
А как такое сделать для Оракла?
← →
Danilka © (2006-09-12 08:13) [6][5] SergP © (12.09.06 07:01)
select * from table1 where rownum <= 10
← →
evvcom © (2006-09-12 08:30) [7]> [3] kaif © (11.09.06 21:49)
> >Причем употребление top обязательно требует order by
> Откуда дровишки ?
Я подумал, что MsGuns дровишками назвал TOP, т.к. в help Local SQL этого top даже в reserved words нету. Так откуда эти дровишки? Видимо из эксперимента?
← →
sniknik © (2006-09-12 09:10) [8]> Я подумал, что MsGuns дровишками назвал TOP
? с чего бы это? совет, не думай над тем что пишут другие (/не интерпретируй), понимай буквально.
> т.к. в help Local SQL этого top даже в reserved words нету.
причем тут Local SQL? в топике про ADO, какогото провайдера... ну так и смотрим его справку.
для примера (не буду уточнять/выяснять какой используется, название провайдера в [0] дано вольное, несуществующее... возму первого попавшегося)
Предикаты ALL, DISTINCT, DISTINCTROW, TOP
Позволяют отобрать записи среди выбранных с помощью запроса на языке SQL.
Синтаксис
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM таблица
Ниже перечислены аргументы инструкции SELECT, содержащей эти предикаты:
.....
TOP n [PERCENT] Возвращает определенное число записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Следующая инструкция SQL позволяет получить список 25 лучших студентов выпуска 1994 года:
SELECT TOP 25
Имя, Фамилия
FROM Студенты
WHERE ГодВыпуска = 1994
ORDER BY СреднийБалл DESC;
Если предложение ORDER BY будет опущено, запрос возвратит произвольный набор 25 записей из таблицы «Студенты», удовлетворяющих предложению WHERE.
Предикат TOP не осуществляет выбор между равными значениями. Если в предыдущем примере средние баллы двадцать пятого и двадцать шестого студента будут равны, то запрос возвратит 26 записей.
Кроме того, можно использовать зарезервированное слово PERCENT для возврата определенного процента записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Предположим, что вместо 25 лучших студентов следует отобрать студентов, попавших в последние 10 процентов:
SELECT TOP 10 PERCENT
Имя, Фамилия
FROM Студенты
WHERE ГодВыпуска = 1994
ORDER BY СреднийБалл ASC;
Предикат ASC обеспечивает возврат последних значений. Значение, следующее после предиката TOP должно быть числовым значением типа Integer без знака.
Предикат TOP не влияет на возможность обновления запроса.
вот ваши "дровишки", никакой обязательности order by нет, результат вот только произволен. (ну и естественно в справке по уточненному провайдеру может быть другое описание/действие этого преддиката)
← →
ANB © (2006-09-12 10:11) [9]
> select * from table1 where rownum <= 10
Нужно учесть, что если написать так :
select * from T1 where rownum <= 10 order by id
то запрос вернет не первые записи по ID, а в случайном порядке выдернет 10 записей из таблицы (может и угадать :) ) и уже их отсортирует по ID.
← →
kaif © (2006-09-12 21:30) [10]Я хотел как-то ограничить набор до того, как взгляну на данные. У меня в таблице Foxpro 1.5 млн записей.
И просто select * from table1 активируется минимум 8 минут.
Любопытно, что top(30000) активируется за 5 минут.
Попытки изменить это время играми со свойствами ADOQuery ничего не дали (там есть свойства: тип курсора (однонаправленный), ограничение на число возвращаемых строк, доступ (readonly) и т.п.). Все пофигу. Этот тупой Microsoft OLEDB Provider for Visual Foxpro пока всю таблицу не разжует там у себя никакие SQL-ы быстрее делать не хочет. А у меня задача импорта (перегоняю в Firebird), еще по ходу извраты расшифровываю, например поля Integer, записанные в бинарном виде в строки закорюками для экономии места. Причем каждое поле по-своему...
В общем, импорт таблицы наконец запустил. Где-то 1.5 часа будет импортировать. Правда я не очень оптимально сделал вставку в Firebird, но меня больше волновала отладка, так как импорт - однократный. Отладка импорта при таблице, которая 8 минут только открывается, оказалась довольно утомительным делом. Особенно если учесть, что там ещ 10% дубликатов оказалось в полях, которые по идее ключевыми должны быть...
Целый день угрохал на всю эту фигню.
:(
← →
Danilka © (2006-09-13 09:16) [11][10] kaif © (12.09.06 21:30)
Самый легкий способ экспорта, к которому я пришел, не лазить по dbf-кам выкусывая информацию, а все экспортировать как есть, один в один, в базу, затем запуск скрипта, который навешивает необходимые индексы на эти таблицы, выдергивает нужные данные, рассовывает их по нужным таблицам, а затем уже можно удалять таблицы, куда были залиты dbf-ки.
Для этого нет никакой необходимости использовать ADO, можно использовать сторонние компоненты, которые работают с dbf-ками файловым методом, можно самому разобрать формат dbf, благо он легкий, а в индексы лезть нет необходимости, или еще проще - натравить на dbf-ки datapump.
← →
kaif © (2006-09-13 09:38) [12]Danilka © (13.09.06 09:16) [11]
[10] kaif © (12.09.06 21:30)
Самый легкий способ экспорта, к которому я пришел, не лазить по dbf-кам выкусывая информацию, а все экспортировать как есть, один в один, в базу, затем запуск скрипта, который навешивает необходимые индексы на эти таблицы, выдергивает нужные данные, рассовывает их по нужным таблицам, а затем уже можно удалять таблицы, куда были залиты dbf-ки.
Имеется поле NUM. Тип - строка. Однако в нем закодированы бинарно числа (упиханы в три символа). Например, число $00FF0F при такой кодировке имеет первым байтом #0. Поэтому, открыв эту таблицу с помощью ADO (да и любого другого Windows-ориентированного редактора), колонка NUM будет содержать пустые строки. При тупом импорте "в какую-нибудь таблицу" получим пустое поле.
У меня 120 таблиц для импорта. В каждой есть такие поля. Например в той таблице (с полутора миллионами записей) имелось 5 таких полей, причем в некоторых из них в каждый байт записывались не бинарные данные, а два разряда десятичного представления, а в некоторых лидирующий байт вообще означал иное, чем два последующих.
Для этого нет никакой необходимости использовать ADO, можно использовать сторонние компоненты, которые работают с dbf-ками файловым методом, можно самому разобрать формат dbf, благо он легкий, а в индексы лезть нет необходимости, или еще проще - натравить на dbf-ки datapump.
Datapump даже не откроет такую таблицу - даст ошибку "испорчен заголовок".
Так как это FOXPRO, а не просто DBF. Там есть мемо-поля FPT. И информацию из них также надо брать.
Я могу руками разобрать DBF, как поток. Но я не снаю, как устроен FPT-файл и разбирать его руками - потерять больше времени, чем задействовать ADO.
← →
Danilka © (2006-09-13 10:17) [13][12] kaif © (13.09.06 09:38)
> Например, число $00FF0F при такой кодировке имеет первым
> байтом #0.
Круто!
И как-же удалось решить эту проблему, используя АДО?
> Но я не снаю, как устроен FPT-файл и разбирать его руками
> - потерять больше времени, чем задействовать ADO.
Честно говоря, очень сомневаюсь. ftp это хранилище. Скорее всего, в dbf-ке, в мемо-поле просто хранится адрес смещения в ftp файле и кол-во байтов.
← →
ANB © (2006-09-13 12:46) [14]
> kaif © (13.09.06 09:38) [12]
У меня есть качалка из фокса. Прямая, причем разбирает и мемо поля. Писал сам, посему есть исходники. Завтра могу притащаить на работу. Только придется переделать с закачки в MS SQL на нужный тебе FB.
← →
kaif © (2006-09-13 14:41) [15]2 ANB © (13.09.06 12:46) [14]
Спасибо Вам большое за предложение помощи, но я уже вроде справился.
Мне еще принесли компоненты Apollo - я посмотрю. Если хороший компонент (решающий похожие проблемы с бинарными полями), то я может его куплю как-нибудь в будущем.
Пока обойдусь ADO. Остальные таблицы не такие здоровые и ADO справляется легко.
2 Danilka © (13.09.06 10:17) [13]
проблема с бинарными полями решается так:
В ADO можно в SQL-запрос вставлять функцию
cast(<поле> as VarBinary(<нужное число байт>))
Например:select
cast(id as VarBinary(3)) id,
name
from
table1
И Delphi создаст в датасете поле типа TVarBytesField.
Если вызвать метод AsString у этого типа поля, то можно будет обратиться к любому байту, так как строка в Delphi определяет свой конец не по нулевому символу, а иным образом.
Допустим:var
s: string;
id: integer;
begin
s := ADOQuery1.FieldByName("id").AsString;
id := ord(s[1]) * 256 * 256 + ord(s[2]) * 256 + ord(s[3]); //примитивно, но работает. :)
end;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.047 c