RXL
Технический
Администратор
Offline
Пол:
|
|
« : 03-04-2006 13:15 » |
|
До книг я еще не добрался, а интересные факты уже вылазят.
2453829 == 2006 апрель 03
Хм... Они часом не от сотворения мира отсчитывают?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #1 : 03-04-2006 14:03 » |
|
угу, от 00.00.0000 SQL> SELECT to_date('03.04.2006', 'dd.mm.yyyy')-2453828 FROM dual;
TO_DATE('03.04.2006','DD.MM.YY ------------------------------ 00.00.0000
|
|
« Последнее редактирование: 04-12-2007 21:36 от Алексей1153++ »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #2 : 03-04-2006 15:07 » |
|
SELECT TO_DATE(2453829, 'J'), TO_DATE(2453828, 'J');
03.04.06 02.04.06 ^^^^Это не реальный дамп, а по памяти - сегодня пробовал. Т.е. тут расчет в днях. 'J' - юлианский календарь. Т.е. все таки от сотворения мира... Просто много для меня нового. Я привык к mysql. Язык тот же, но набор ф-ий другой. И некоторые операторы иначе работают. И, почему-то, кавычки одного типа только принимает. В общем, загадочная система и тормозная (первое впечатление - реально не сравнивал): DISTINCT для 5млн записей минут 40 выполнялся.
|
|
« Последнее редактирование: 04-12-2007 21:37 от Алексей1153++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #3 : 04-04-2006 05:11 » |
|
Oracle гораздо быстрей MySql если его правильно настроить. И язык не совсем тот же. Вот, например, у меня Distinct на 3 милионах выполнялся 25 секунд. Правда и сервак довольно мощный.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Sla
|
|
« Ответ #4 : 04-04-2006 06:27 » |
|
RXL, не сравнивай. Типа "торг здесь не уместен" Задачи разные бывают, условия и тд. Возможно таблица не проиндексирована отсюда и тормоза. А к pl/sql просто надо привыкнуть. Очень простой и очень понятный язык - встроенные функции имеют "человеческие имена" (sys_date, for example). Преобразование форматов типа to_date, to_number, to_char Cтолкнешься с виртульной таблицей dual - не пугайся, прими на веру.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dusk
Команда клуба
Offline
Пол:
Редкий, но веселый вид
|
|
« Ответ #5 : 04-04-2006 10:06 » |
|
Sla, во всяком диалекте есть свои плюсы и минусе, например встроенные процедуры и функции - это хорошо, но нет TOP 1, из-за чего приходиться извращаться при выборке необходимых данных, хотя в MSSQL это делается просто...
|
|
|
Записан
|
Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших Опыт - это то, что появляется сразу после того, как он был так необходим... Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #6 : 04-04-2006 10:13 » |
|
например...
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Dusk
Команда клуба
Offline
Пол:
Редкий, но веселый вид
|
|
« Ответ #7 : 04-04-2006 10:35 » |
|
например надо выбрать последнюю запись из тех, у которых дата сохранения меньше или равна заданной.
в MSSQL: Select TOP 1 * From tbl Where date<=my_date Order By date desc (не уверен в синтаксисе - пишу на вскидку, но примерно так)
в PL\SQL: Select * From (Select * From tbl Where date<=to_date(my_date,'dd.mm.yyyy') Order By date desc) Where ROWNUM=1
т.е. в PL\SQL получаем запрос из запроса в более сложных вариантах проблемм больше...
|
|
« Последнее редактирование: 04-12-2007 21:50 от Алексей1153++ »
|
Записан
|
Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших Опыт - это то, что появляется сразу после того, как он был так необходим... Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #8 : 04-04-2006 11:23 » |
|
Sla, во всяком диалекте есть свои плюсы и минусе, например встроенные процедуры и функции - это хорошо, но нет TOP 1, из-за чего приходиться извращаться при выборке необходимых данных, хотя в MSSQL это делается просто...
Есть такое Но всему есть и альтернатива MSSQL - TOP , MySQL - LIMIT и на Oracle можно сделать Вот например : MSSQL create procedure sql_sp_select_top as DECLARE @a number select top 1 @a=col1 from tab1
То же на Oracle CREATE OR REPLACE PROCEDURE sql_sp_select_top AS v_a VARCHAR2(255); BEGIN select col1 INTO v_a from tab1 WHERE ROWNUM <=1; END;
ЗЫ. Имхо TOP в MSSQL и LIMIT в MySQL однозначно рулит Жаль что в Оракле не продумали подобного механизма
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #9 : 04-04-2006 11:29 » |
|
ну это SQL а не PL\SQL в PL\SQL for v in (Select * From tbl Where date<=to_date(my_date,'dd.mm.yyyy') Order By date desc) loop res := v.my_date; exit; end loop; да и вьюху проще сделать... а, например, предпоследнюю ? я согласен с Типа "торг здесь не уместен" нужно выбирать СУБД для конкретной задачи.
|
|
« Последнее редактирование: 19-12-2007 22:16 от Алексей1153++ »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #10 : 04-04-2006 11:32 » |
|
Жаль что в Оракле не продумали подобного механизма ну это все делается как раз через Select * From (Select * From tbl Where ... order ... desc) Where ROWNUM<Х http://www.ispirer.com/doc/sqlways38/Output/SQLWays-1-044.html
|
|
« Последнее редактирование: 04-04-2006 11:34 от PooH »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 04-04-2006 11:43 » |
|
Спасибо всем. Интересно рассказываете. Я как раз сразу обнаружил нехватку LIMIT. Почитаю, подкуюсь - будут вопросы
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dusk
Команда клуба
Offline
Пол:
Редкий, но веселый вид
|
|
« Ответ #12 : 04-04-2006 12:27 » |
|
PooH, курсоры в PL\SQL это вообще отдельная тема, некоторые только их и используют, хоть они и быстро работают, но иногда лучше без них... В твоем варианте сначала выбираются все данные, а потом из них ты выбираешь значение в переменную (а если нужно выбрать несколько значений из строки)... В запросе SQL сразу возвращаются нужные данные... в PL\SQL много можно сделать, но некоторые вещи просто делаются извратно... Упомянутый формат Data - это вообще отдельная песня... Опять же есть огромные плюсы, например те же подпроцедуры... Согласен с нужно выбирать СУБД для конкретной задачи.
|
|
|
Записан
|
Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших Опыт - это то, что появляется сразу после того, как он был так необходим... Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #13 : 04-04-2006 12:47 » |
|
Жаль что в Оракле не продумали подобного механизма ну это все делается как раз через Select * From (Select * From tbl Where ... order ... desc) Where ROWNUM<Х Енто понятно, только как-то громоздко
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #14 : 04-04-2006 13:49 » |
|
В твоем варианте сначала выбираются все данные, а потом из них ты выбираешь значение в переменную (а если нужно выбрать несколько значений из строки) Выбирается одна запись. Все данные записи есть в курсорной переменно v. res использовал для примера. А если нужно несколько значений - можно и курсор объявить отдельно, и курсорную переменную и таблицу курсорнух переменных. Я привел пример, именно PL\SQL - кода просто, чтобы отличить SQL от PL\SQL, можно было и так написать (уже с SQL не перепутаешь): BEGIN select col1 INTO v_a from tab1 WHERE ROWNUM <=1; END; просто, по-моему, тут небольшая путаница, между Oracle Sql и PL\SQL возникла.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #15 : 04-04-2006 13:53 » |
|
Упомянутый формат Data - это вообще отдельная песня Как раз по теме! Давай обсудим. Иногда совсем не обязательно использовать to_date... достаточно установить переменную сессии NLS_DATE_FORMAT.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Dusk
Команда клуба
Offline
Пол:
Редкий, но веселый вид
|
|
« Ответ #16 : 05-04-2006 06:29 » |
|
Pooh, ты совсем упростил - нет ни выборки по дате, ни сортировки...
BEGIN select col1 INTO v_a from tab1 WHERE ROWNUM <=1; END;
Тут все правильно, но если чуть усложнить, то появляются проблемы...
Про Date могу сказать, что в SQL есть два типа Date и DateTime. Так вот при связи Оракла с другими прогами возникали проблемы..
|
|
|
Записан
|
Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших Опыт - это то, что появляется сразу после того, как он был так необходим... Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #17 : 05-04-2006 08:00 » |
|
ты совсем упростил - нет ни выборки по дате, ни сортировки... опять же это просто пример кода... то появляются проблемы... есть такие, которые не получилось решить? Так вот при связи Оракла с другими прогами возникали проблемы.. А, ты вот про что. Я подумал, что проблемы внутри Oracle.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Dusk
Команда клуба
Offline
Пол:
Редкий, но веселый вид
|
|
« Ответ #18 : 05-04-2006 10:08 » |
|
ты совсем упростил - нет ни выборки по дате, ни сортировки... опять же это просто пример кода... Я же сказал: например надо выбрать последнюю запись из тех, у которых дата сохранения меньше или равна заданной.
в PL\SQL: Select * From (Select * From tbl Where date<=to_date(my_date,'dd.mm.yyyy') Order By date desc) Where ROWNUM=1
это конкретный пример с которым недавно сталкнулся. то появляются проблемы... есть такие, которые не получилось решить? Решаются, но извратно... Вообще-то спол не имеет смысла, ведь уже говорилось: Согласен с нужно выбирать СУБД для конкретной задачи.
|
|
« Последнее редактирование: 04-12-2007 21:51 от Алексей1153++ »
|
Записан
|
Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших Опыт - это то, что появляется сразу после того, как он был так необходим... Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #19 : 05-04-2006 11:19 » |
|
Вообще-то спол не имеет смысла. Мы, вроде бы, ниочем и не спорим. По-моему, возникло какое-то недопонимание... А никого не переубеждаю и не навязываю своего мнения и не защищаю Oracle. Просто мне приходтся с ним работать уже больше 4 лет... Мои посты типа "for v in..." и "Begin select * ...." только для разделения мух и котлет - разделения ORACLE SQL(язык запросов) и PL\SQL (процедурный язык). Все вопросы про проблемы - для самообразования, по-этому после фраз: Решаются, но извратно... так и хочется спросить - какие именно проблемы и как решаются? это конкретный пример с которым недавно сталкнулся. могу тоже привести пример: нужно выгрузить 300000 в ексель, на одной странице у него 65535 - задача написать запрос (SQL, не PL\SQL): пронумеровать строки (доп.требование) и выбрать последовательно - я делал тройным запросом (модифицирую для каждой части). Интересно узнать - как это можно было реализовать в MSSQL или MySQL?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Dusk
Команда клуба
Offline
Пол:
Редкий, но веселый вид
|
|
« Ответ #20 : 05-04-2006 13:29 » |
|
Фишка в том, что SQL работает через какую-нибудь прогу, и такие вопросы разруливаются прогой.... Кстати, если ексель на машине пользователя, то там тоже другая прога...
|
|
|
Записан
|
Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших Опыт - это то, что появляется сразу после того, как он был так необходим... Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #21 : 05-04-2006 13:37 » |
|
Ну скажем по другому: есть таблица из 1000000 строк, нужно, выбрать из них 300000 (по условию), пронумеровать от 1 до 300000, и выбрать строки с 60000 по 199999. (вот именно так у меня и получился тройной запрос). select * from (select rownum, t.* (select * from table where ...) t) s where s.rownum between 60000 and 119999;
Вопрос можно ли в MySQL или MSSQL сделать проще?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #22 : 05-04-2006 14:21 » |
|
MySQL 4.0: SEТ @cnt=0; SELECT @cnt=@cnt+1 AS 'N', * FROM tbl WHERE ... LIMIT 0,60000; SELECT @cnt=@cnt+1 AS 'N', * FROM tbl WHERE ... LIMIT 60000,60000; SELECT @cnt=@cnt+1 AS 'N', * FROM tbl WHERE ... LIMIT 120000,60000; .... Все запросы в одной сессии. Таблицу стоит заблокировать (для MyISAM). Насчет работы с переменными стоит уточнить - немного подзабыл.
Или я все же не понял... rownum - существующий столбец в таблице или как?
|
|
« Последнее редактирование: 04-12-2007 21:52 от Алексей1153++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #23 : 05-04-2006 15:19 » |
|
rownum (как, например, и rowid) это мнимые что ли... rownum есть у записи всегда - это номер записи в результе запроса
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #24 : 05-04-2006 16:03 » |
|
Понятно Поправка к mysql коду: переменные в SELECT присваиваются через ':='.
|
|
« Последнее редактирование: 04-12-2007 21:53 от Алексей1153++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #25 : 06-04-2006 06:10 » |
|
rownum & rowid - такие виртуальные (псевдостолбцы), существуют на время запроса
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #26 : 06-04-2006 09:35 » |
|
немного уточню, rowid существует постоянно и относится к конкреной записи.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
|