Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2009, 22:22   #1
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию Как разделить таблицу на много таблиц с количеством строк = 65535?

Всем доброго времени суток!

На работе есть табличка. В ней более 10 миллионов строк. Появилась задача - надо в явном виде (без всяких пивотов) выгрузить эту таблицу в экселевские файлы. Проблема в том, что в лист екселя 2003 влазит не больше 65536 строчек. Таким образом, необходимо разбить эту таблицу на более мелкие. Короче, вопрос такой:
Как написать процедуру (или как это называется), которая создаст много табличек из исходной,в которых по 65536 строк, и которые будут называться (например) Табл1,...ТаблN.
На работе вся БД на oracle. Запросы пишем в sql навигаторе.
Я в sql практически ничего не понимаю. Могу только простетские запросы писать типа select.. from.. where... Так что прошу сильно не пинать.
Всем заранее спасибо.
"Hello, world!" - 17 errors 56 warnings
Тупой вне форума Ответить с цитированием
Старый 25.08.2009, 22:45   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а вам точно нужно 10^7/65536 таблиц?
раз уж у вас есть уже одна таблица с данными может просто на дельфи слабать экспорт в эксель (примеров полно)?!
еще вариант - перейти на 2007й офис
soleil@mmc вне форума Ответить с цитированием
Старый 25.08.2009, 23:10   #3
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию

нет...
Дельфи на работе нет.
Нужно действительно 10^7/65536 таблиц.
ПС - это не так уж и много) Всего то 150)
ППС: пожалуйста, по возможности, не надо говорить, что мне это не нужно. Просто, если ктото знает, скажите как поделить табличку и все. Мне кажется, что это не сложно.
"Hello, world!" - 17 errors 56 warnings
Тупой вне форума Ответить с цитированием
Старый 25.08.2009, 23:59   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

создать таблички не так и долго
остается вопрос: как вы будете перегонять данные из оракла в эксель?
как ответите на этот вопрос - помогу с запросом
soleil@mmc вне форума Ответить с цитированием
Старый 26.08.2009, 06:34   #5
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию

из оракла в эксель данные перегоняются сл. образом:
В екселе: данные, сводная таблица, импорт внешних данных, выбирается табличка, нажимается ОК и все. Сформируется сводная таблица, в которой 65536 строк. Если её развернуть (щелкнуть два раза на итог), то как раз получится кусок таблицы из БД.
"Hello, world!" - 17 errors 56 warnings
Тупой вне форума Ответить с цитированием
Старый 26.08.2009, 18:28   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

так уж вышло, что весь день вне компа

вот на работе где-то у меня была приблуда для экспорта данных в эксель с разбивкой под старый вариант офиса с ограничением в 65000 строк, но раз хочется дублировать данные, то получайте

скрипт проверить не на чем пока (завтра могу потестить, может будет что оптимизировать...) - так что некоторые моменты возможно придется подправлять + названия таблиц и полей затачивать под себя в обязательном порядке

Код:
declare
  l_select varchar2(2048);
  l_count number;
  l_max_rows_one_page number := 65536;
  i number;
begin
  /* 
  получаем общее число записей в таблице и формируем из него
  полное число таблиц по 65536 строк
  */
  select ceil(count(*) / l_max_rows_one_page)
  into l_count
  from your_table;  

  for i:=1 to l_count 
  loop
    l_select := 'create table table' || i || 
      ' as select * from( ' || 
      'select row_number() over(order by field1) rn, ' ||
      ' t.* from your_table t) ' ||
      'where 0=0 ' ||
      '  and rn > :p0 * (:p1 - 1)' ||
      '  and rn < :p2 * :p3 + 1';

    execute immediate l_select using l_max_rows_one_page, i, l_max_rows_one_page, i;
  end loop;
  commit;
end;
/
З.Ы.: первое дополнение, которое пришло в голову, лпадить номера таблиц до 3х знаков нулями чтобы они в вашей гуи отображались в правильном порядке

Последний раз редактировалось soleil@mmc; 26.08.2009 в 18:42.
soleil@mmc вне форума Ответить с цитированием
Старый 26.08.2009, 21:56   #7
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию

ух ты!
Спасибо, посмотрю обязательно...
Сегодня на работе пришла в голову другая мысль:
Что если к большой таблице добавить поле, которое будет считаться как Целая часть(Число строк в таблице/65536) (пусть это будет поле Х). Потом импортировать эту табличку в эксель, и из неё уже по каждому из вновь добавленного поля (по двойному клику) получать листик с 65536 записями. Впринципе это и было проделано сегодня, но есть один ньюанс:
Допустим в исходной таблице есть поле Номер - не уникальное, то есть могут встречаться строчки с одинаковыми значениями этого поля. Так вот: строчки с одинаковым значением поля Номер не могут находиться на разных листах рабочей книги. Таким образом, приходится вручную сортировать и перетаскивать строчки из одного листа в другой. Хотя перед тем, как добавить поле Х таблица была упорядочена по полю Номер, все равно приходится делать рутинную работу руками.
Так вот, просьба к тем, кто понял, о чем я говорю, подскажите (или намекните), как автоматизировать процесс?
"Hello, world!" - 17 errors 56 warnings
Тупой вне форума Ответить с цитированием
Старый 26.08.2009, 23:45   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

таблица больше не изменяется? в смысле пользователи ее больше не редактируют?

запросом можно так получить (хотя, может есть еще какая-то оконная функа, которая сразу выдаст номер поддиапазона...)
Код:
select
  ceil(tt.rn/65536) table_number,
  tt.*
from(select row_number() over(order by field1) rn, t.* from your_table t) tt
для более детальных ответов нужна структура таблицы с описанием полей
soleil@mmc вне форума Ответить с цитированием
Старый 27.08.2009, 12:35   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

добавочка - ExConverter (автор предлагает экспортить данные в XML и заливать их в эксель через шаблоны)

как бы там ни было я изначально за прогу на клиенте, которая будет выбирать данные из таблицы и экспортить их в эксель/калк (кому что больше нравится/доступно)
ибо после подобных экспериментов бессмысленно засирается схема

Последний раз редактировалось soleil@mmc; 27.08.2009 в 12:50.
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевернуть и разделить. Много Sac Microsoft Office Excel 4 24.08.2009 16:25
Количество строк с условием между таблиц Deight SQL, базы данных 2 07.05.2009 01:14
Много таблиц, выборочное удаение строк Ice_Juice Microsoft Office Excel 1 11.03.2008 09:05
как разделить текст на переменные GAGARIN-NEW Общие вопросы Delphi 2 07.10.2007 15:24
как вывести число с ограниченным количеством цифр после запятой? delphi Ensoph Помощь студентам 1 02.10.2007 07:50