- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
CREATE TABLE `numbers` (
`number` BIGINT(20) DEFAULT NULL
) ENGINE=InnoDB;
CREATE TABLE `numbers_small` (
`number` INT(11) DEFAULT NULL
) ENGINE=InnoDB;
-- numbers
INSERT INTO `numbers` (`number`) VALUES('0');
INSERT INTO `numbers` (`number`) VALUES('1000');
INSERT INTO `numbers` (`number`) VALUES('2000');
INSERT INTO `numbers` (`number`) VALUES('3000');
INSERT INTO `numbers` (`number`) VALUES('4000');
INSERT INTO `numbers` (`number`) VALUES('5000');
-- 10 000 lines of inserting numbers into table numbers
-- ...
INSERT INTO `numbers` (`number`) VALUES('5999');
INSERT INTO `numbers` (`number`) VALUES('6999');
INSERT INTO `numbers` (`number`) VALUES('7999');
INSERT INTO `numbers` (`number`) VALUES('8999');
INSERT INTO `numbers` (`number`) VALUES('9999');
-- numbers small
INSERT INTO `numbers_small` (`number`) VALUES('0');
INSERT INTO `numbers_small` (`number`) VALUES('1');
INSERT INTO `numbers_small` (`number`) VALUES('2');
INSERT INTO `numbers_small` (`number`) VALUES('3');
INSERT INTO `numbers_small` (`number`) VALUES('4');
INSERT INTO `numbers_small` (`number`) VALUES('5');
INSERT INTO `numbers_small` (`number`) VALUES('6');
INSERT INTO `numbers_small` (`number`) VALUES('7');
INSERT INTO `numbers_small` (`number`) VALUES('8');
INSERT INTO `numbers_small` (`number`) VALUES('9');
Сделали нам программу на java. Прислали скрипт для обновления базы данных DatabaseUpdateScript.sql на 874 KB.
Или все же в мускуле есть какой-то аналог?
P.S. Стековерфловочка подсказывает, что нету.
так сложно было подсмотреть, что сделано у взрослых?..
> select generate_series(1, 10000);
видимо select * from generate_series(1, 10000) ? пытался найти что в m$ с иерархическими запросами, оказалось всё печально, какие то union all, какая то неочевидная переголова
первый запрос определяется так сказать init запрос.
далее, делаем union all то CTE, в котором она используется, т.е. tbl. и все, этот union all будет добавляется, пока хотя бы одна строка возвращается во втором запросе.
например вот
и кстати, у меня этот запрос вернул 11к строк за 1 секунду, когда на этой же сервере (да, на одной виртуальке крутятся mssql и oracle) отработал за 2 секунды
то ли дело условия выборки корневых значений и всю вторую половину запроса заменить на start with + connect by
впрочем, оракловый sys_connect_by_path сам не без изъяна (хорошо хоть нужен редко)
Ага. Вот только интересно, почему оно работает и без from... В доке ничего не написано о той форме записи, которую я сдуру по памяти привёл:
вот это прикольно, конечно
хоть и неожиданно
если разной длины колонки будут - недостающие значения будут, видимо, null?
Авотхуй! Получается наименьшее общее кратное от количества записей в каждой серии. Довольно странная фича, и недокументированная.
P.S. Есть вероятность, что это какая-то общая фишка для функций, возвращающих множество строк, а не только generate_series.
Да, так и есть.
Currently, functions returning sets can also be called in the select list of a query. For each row that the query generates by itself, the function returning set is invoked, and an output row is generated for each element of the function's result set. Note, however, that this capability is deprecated and might be removed in future releases.
А НОК вместо декартового произведения получается из-за того, что одинаковые строки из результата повыкидывало.
бтв
http://sqlfiddle.com/#!4/3a8b2/2
есть СУБД, где во встроенном языке можно в шаблоны?...
Я ее невнимательно читал раньше. Вот только сегодня заметил про таймштампы.
> http://sqlfiddle.com/#!4/3a8b2/2
Красиво. Впрочем в постгресе я тоже так могу ;)
> где во встроенном языке можно в шаблоны?
Ну если оракл не умеет (а у него же самое продвинутое ООП из всех СУБД, емнип), то скорее всего, что нигде. Кстати, жабья хранимка не может принимать объекты произвольных типов (ну или какого-нибудь супертипа Object)?
есть еще вариант
В постгресе select * from generate_series(1, 10000) отвечает за 1-2мс :) Ну комп, правда, не самый слабый.
Допустим есть строка, в неё чего-то упаковано (дни месяца, битовые флаги), джойним пишем substring(i,i+1) и разворачиваем эту упаковку из горизонтальной в вертикальную, которую мы уже можем взять where.
> INSERT INTO `numbers` (`number`) VALUES('9999');
Наступил 3802 день нашей телестройки...
Сегодня между ребятами присутствовало со вчерашнего отсутствовало со вчерашнего взор, и только Марина Африкантова стройке, где поссорились на стройке, где поссорились на повышел молодой отец. Напряжение между ребятами присутствовало со вчерашнего в Питер Ильи Григоренко серьёзно пола, Егор Холявин всё ещё несчастлив.
лучше иметь качественную таблицу dim_dates, с кучей полезных колонок (не только даты, но и дни недели, номер недели, декады, квартала и т.д.), которую заполнить один раз -
на 10 лет каких-то сраных 3600 строк в ней (для субд это слёзы, когда речь идёт о статистике на миллионы записей за заданный перид отчета),
чем постоянно на лету генерить какой-то массив
вообще, там много функций есть для работы с датами http://msdn.microsoft.com/en-us/library/ms186724(v=sql.110).aspx
Выходные != суббота + воскресенье.
Тут же просто таблица из одной колонки для чисел.
в отсутствие generate_series и других инлайн-sql-способов генерации нужной пачки последовательных значений, мастерам майэскуэльного кунг-фу приходится изворачиваться такой говнотаблицей (странно, правда, что 10к записей всего, непорядок)
хотя, конечно, майскл ни разу в этом месте не оракл, и я бы поостерегся вообще на сторону этой базы переносить в sql то, что можно сделать на, прости господи, php
а в оракле ту же генерацию пачки значений я применял, применяю и буду применять в сложных запросах, когда речь идёт о перелопачивании в одном запросе тысячей значений, и контекст из базы в приложение и обратно в базу переключать совсем не охота и ни к чему