- 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.
mishanon 08.10.2014 08:23 # 0
wvxvw 08.10.2014 09:09 # 0
bormand 08.10.2014 09:23 # +2
tirinox 08.10.2014 09:48 # 0
bormand 08.10.2014 10:31 # +1
bormand 08.10.2014 10:33 # −1
Lokich 08.10.2014 11:24 # −1
bormand 08.10.2014 11:27 # 0
Или все же в мускуле есть какой-то аналог?
P.S. Стековерфловочка подсказывает, что нету.
Lokich 08.10.2014 11:40 # 0
bormand 08.10.2014 11:45 # 0
defecate-plusplus 08.10.2014 12:56 # 0
так сложно было подсмотреть, что сделано у взрослых?..
> select generate_series(1, 10000);
видимо select * from generate_series(1, 10000) ? пытался найти что в m$ с иерархическими запросами, оказалось всё печально, какие то union all, какая то неочевидная переголова
Lokich 08.10.2014 14:21 # 0
первый запрос определяется так сказать init запрос.
далее, делаем union all то CTE, в котором она используется, т.е. tbl. и все, этот union all будет добавляется, пока хотя бы одна строка возвращается во втором запросе.
например вот
и кстати, у меня этот запрос вернул 11к строк за 1 секунду, когда на этой же сервере (да, на одной виртуальке крутятся mssql и oracle) отработал за 2 секунды
defecate-plusplus 08.10.2014 16:19 # 0
то ли дело условия выборки корневых значений и всю вторую половину запроса заменить на start with + connect by
впрочем, оракловый sys_connect_by_path сам не без изъяна (хорошо хоть нужен редко)
bormand 08.10.2014 15:49 # 0
Ага. Вот только интересно, почему оно работает и без from... В доке ничего не написано о той форме записи, которую я сдуру по памяти привёл:
defecate-plusplus 08.10.2014 16:21 # 0
вот это прикольно, конечно
хоть и неожиданно
если разной длины колонки будут - недостающие значения будут, видимо, null?
bormand 08.10.2014 16:29 # 0
Авотхуй! Получается наименьшее общее кратное от количества записей в каждой серии. Довольно странная фича, и недокументированная.
bormand 08.10.2014 16:36 # 0
P.S. Есть вероятность, что это какая-то общая фишка для функций, возвращающих множество строк, а не только generate_series.
bormand 08.10.2014 16:44 # 0
Да, так и есть.
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.
А НОК вместо декартового произведения получается из-за того, что одинаковые строки из результата повыкидывало.
bormand 08.10.2014 16:01 # 0
defecate-plusplus 08.10.2014 16:45 # 0
бтв
http://sqlfiddle.com/#!4/3a8b2/2
есть СУБД, где во встроенном языке можно в шаблоны?...
bormand 08.10.2014 17:11 # 0
Я ее невнимательно читал раньше. Вот только сегодня заметил про таймштампы.
> http://sqlfiddle.com/#!4/3a8b2/2
Красиво. Впрочем в постгресе я тоже так могу ;)
> где во встроенном языке можно в шаблоны?
Ну если оракл не умеет (а у него же самое продвинутое ООП из всех СУБД, емнип), то скорее всего, что нигде. Кстати, жабья хранимка не может принимать объекты произвольных типов (ну или какого-нибудь супертипа Object)?
Lokich 08.10.2014 14:10 # −1
есть еще вариант
bormand 08.10.2014 16:14 # 0
В постгресе select * from generate_series(1, 10000) отвечает за 1-2мс :) Ну комп, правда, не самый слабый.
wvxvw 08.10.2014 13:24 # 0
anonimb84a2f6fd141 08.10.2014 14:11 # −4
Lokich 08.10.2014 14:21 # −1
anonimb84a2f6fd141 08.10.2014 14:29 # −4
anonimb84a2f6fd141 08.10.2014 14:31 # −3
ftr 08.10.2014 20:39 # 0
3.14159265 08.10.2014 20:42 # +1
Допустим есть строка, в неё чего-то упаковано (дни месяца, битовые флаги), джойним пишем substring(i,i+1) и разворачиваем эту упаковку из горизонтальной в вертикальную, которую мы уже можем взять where.
bormand 08.10.2014 20:47 # +1
1024-- 08.10.2014 21:02 # 0
> INSERT INTO `numbers` (`number`) VALUES('9999');
Наступил 3802 день нашей телестройки...
Сегодня между ребятами присутствовало со вчерашнего отсутствовало со вчерашнего взор, и только Марина Африкантова стройке, где поссорились на стройке, где поссорились на повышел молодой отец. Напряжение между ребятами присутствовало со вчерашнего в Питер Ильи Григоренко серьёзно пола, Егор Холявин всё ещё несчастлив.
defecate-plusplus 09.10.2014 08:35 # +1
лучше иметь качественную таблицу dim_dates, с кучей полезных колонок (не только даты, но и дни недели, номер недели, декады, квартала и т.д.), которую заполнить один раз -
на 10 лет каких-то сраных 3600 строк в ней (для субд это слёзы, когда речь идёт о статистике на миллионы записей за заданный перид отчета),
чем постоянно на лету генерить какой-то массив
bormand 09.10.2014 08:44 # 0
Lokich 09.10.2014 12:25 # 0
вообще, там много функций есть для работы с датами http://msdn.microsoft.com/en-us/library/ms186724(v=sql.110).aspx
bormand 09.10.2014 13:13 # +1
Выходные != суббота + воскресенье.
ftr 09.10.2014 20:20 # 0
Тут же просто таблица из одной колонки для чисел.
defecate-plusplus 09.10.2014 21:11 # +2
в отсутствие generate_series и других инлайн-sql-способов генерации нужной пачки последовательных значений, мастерам майэскуэльного кунг-фу приходится изворачиваться такой говнотаблицей (странно, правда, что 10к записей всего, непорядок)
хотя, конечно, майскл ни разу в этом месте не оракл, и я бы поостерегся вообще на сторону этой базы переносить в sql то, что можно сделать на, прости господи, php
а в оракле ту же генерацию пачки значений я применял, применяю и буду применять в сложных запросах, когда речь идёт о перелопачивании в одном запросе тысячей значений, и контекст из базы в приложение и обратно в базу переключать совсем не охота и ни к чему
ftr 09.10.2014 21:52 # 0