![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужен аналог "...TABLE_1 left outer join (TABLE_2, TABLE_3) on .. [D6]
Курдль © (2005-12-12 16:48:00)Приветствую!
С привеликим удовольствием вернулся к Ораклу, но многое уже подзабыл.
Сейчас переделываю проект под Оракл. Есть конструкции, которые не поддаются изящной трансформации. Например, внешние соединения основной таблицы с групой подчиненных вида
"...from T1 left outer join (T2, T3) on T3.T2_ID = T2.T2_ID and T2.T1_ID = T1.T1_ID"
Как бы это адаптировать под оракл?
evvcom (2005-12-13 17:15:00) [1]
> В 2005 можно работать с версиями
А какие уровни изолированности транзакции они там реализовали?
Курдль (2005-12-13 17:03:00) [2]
> Fay © (13.12.05 16:47) [31]
> Данные несколько устарели. В 2005 можно работать с версиями.
Я в курсе. Только пока не слышал ни одного объективного отзыва, можно ли вообще с ним работать. Если окажется, что можно - я без внутреннего содрогания включу его в свой список СУБД "к применению". Но пока мне хватает того, что есть.
Fay (2005-12-13 16:47:00) [3]2 Курдль © (13.12.05 10:38) [18]
> MS SQL - блокировщик
Данные несколько устарели. В 2005 можно работать с версиями.
evvcom (2005-12-13 16:41:00) [4]
> возникает необходимость сначала снабдить все связанные наборы
> данных окончательным значением внешнего ключа.
Т.е. ты сначала создаешь запись ссылающуюся по сути на запись справочника, а потом саму эту запись? А проверка целостности (foreign key constraint) что отсутствует?
> часто возникает необходимость
извини, но ни разу не возникало такой необходимости. Сначала запись в справочнике, а потом уже детали. А если должны быть они либо вместе добавлены, либо отменены, то есть на это транзакции, commit и rollback. Ну и хранимки.
Курдль (2005-12-13 16:11:00) [5]
> Зачем нужно? Многие говорят "мне нужно". А когда начинаешь
> разбирать его цель, оказывается, что это совсем и не нужно.
Я щаз обосную, зачем мне это нужно. Но от специалистов по MS SQL сразу послышится их любимое "А какие проблемы? Хранимка это все разрулит!" :)
У них все разруливается ХП.
Так вот, если есть форма добавления составной сущности (напр. субъекта с его адресами, счетами, паспортами, лицензиями и мн. др.) то часто возникает необходимость сначала снабдить все связанные наборы данных окончательным значениемвнешнего ключа. Вот тогда-то и помогаетselect Get_Identity('SUBJECTS', 1)
evvcom (2005-12-13 16:00:00) [6]
> Или такой скрипт:
А какие проблемы?
insert into SUBJECTS (SBJ_NAME) values ('ООО Мавзолей");
MyVar = @@Identity;
insert into ADDRESS (SBJ_ID, ADR_CONTEXT) values (MyVar, 'Москва, Красная Площадь, 1');
insert into ACCOUNTS(SBJ_ID, ACC_NUMBER) values (MyVar, '40702810500000000123');
И никаких ???:)
> Если нужно получить будущий ID на клиент до исполнения "активного
> DML".
Зачем нужно? Многие говорят "мне нужно". А когда начинаешь разбирать его цель, оказывается, что это совсем и не нужно.
Курдль (2005-12-13 15:45:00) [7]
> evvcom © (13.12.05 14:32) [26]
> Может и полезная вещичка, но я и без нее обходился. Сразу
> за инсертом, читаешь глобальную переменную @@IDENTITY (так
> вроде, опять же если память не сбоит)
Я уже не раз приводил пример, когда это не проканает :)
Если нужно получить будущий ID на клиент до исполнения "активного DML".
Или такой скрипт:
insert into SUBJECTS (SBJ_NAME) values ('ООО Мавзолей");
insert into ADDRESS (SBJ_ID, ADR_CONTEXT) values (@@Identity, 'Москва, Красная Площадь, 1');
insert into ACCOUNTS(SBJ_ID, ACC_NUMBER) values ( ???, '40702810500000000123');
А на сайбэйсе это сработало бы так:
insert into SUBJECTS (SBJ_NAME) select Get_Identity('SUBJECTS', 1), 'ООО Мавзолей" from DUMMY;
insert into ADDRESS (SBJ_ID, ADR_CONTEXT) select Get_Identity('SUBJECTS', 0), 'Москва, Красная Площадь, 1' from DUMMY;
insert into ACCOUNTS(SBJ_ID, ACC_NUMBER) select Get_Identity('SUBJECTS', 0), '40702810500000000123' from DUMMY;
Почти так же это отработало бы на IB/FB. Еще легче - на Оракле, а вот на MS SQL... :)
evvcom (2005-12-13 14:32:00) [8]
> Например, того же GET_IDENTITY
Может и полезная вещичка, но я и без нее обходился. Сразу за инсертом, читаешь глобальную переменную @@IDENTITY (так вроде, опять же если память не сбоит)
Курдль (2005-12-13 12:51:00) [9]
> evvcom © (13.12.05 12:37) [22]
> Ну без последовательностей я легко обходился в MS SQL. Мне
> хватало IDENTITY.
Кстати, меня сильно поразило то, что в MS SQL отсутствовало даже многое из того, что есть в его прототипе Sybase ASA от Watcom. Например, того же
GET_IDENTITY ( [ owner.] table-name [, num_to_alloc ],... )
Sergey13 (2005-12-13 12:48:00) [10]2[23] ANB © (13.12.05 12:46)
>Во во. Грабля еще та.
Это не грабля. Это блокировка от наступания на граблю. 8-)
ANB (2005-12-13 12:46:00) [11]
> Всвязи с чем нет и проблемы "изменяемой таблицы" (mutating
> table).
Во во. Грабля еще та. И вылезает, где ни попадя. Кстати, я и в обычных хранимках на это нарывался. Когда сложная цепочка вызовов и пакетный апдейт, то на раз на эту граблю наступить.
evvcom (2005-12-13 12:37:00) [12]
> последовательности, триггеры "before"... и мн.др. чего нет
> в MS SQL.
Ну без последовательностей я легко обходился в MS SQL. Мне хватало IDENTITY. Оно и в оракле последовательности использую пока только для генерации первичного ключа, другой надобности пока не возникало. Триггеры, если мне не изменяет память, в MSSQL есть и before и after. Нет триггеров for each row, вот это правда. Всвязи с чем нет и проблемы "изменяемой таблицы" (mutating table). :)
А вообще, у каждой программы есть свои плюсы, и есть свои минусы, и каждый для себя должен сам решить, с какими минусами он мириться может, а с какими нет, чтобы выбрать оптимальный для себя вариант.
Курдль (2005-12-13 12:07:00) [13]
> evvcom © (13.12.05 10:47) [19]
> На этот аргумент приводят "свой": "А вот MS исправят это,
> и тогда по всем параметрам обскачут Оракла!"
Я теоретически допускаю такой вариант. Согласитесь, что у MS появилось немало приличных продуктов. И даже винды уже совсем не те, что были раньше.
VS.NET довольно сильная весчь. Конечно подглючивает, подтормаживает :), но работу титаническую выполняет. Для средства разработки это допустимо. А вот если СУБД будет подглючивать и подтормаживать...
И, честно говоря, я не понимаю, что им стоило в своем MS SQL сделать по людски, - ведь давно понятно, что должна включать в себя приличная СУБД - последовательности, триггеры "before"... и мн.др. чего нет в MS SQL.
ANB (2005-12-13 11:13:00) [14]
> "А вот MS исправят это, и тогда по всем параметрам обскачут
> Оракла!"
Еще и язык перепишут :)))
evvcom (2005-12-13 10:47:00) [15]На этот аргумент приводят "свой": "А вот MS исправят это, и тогда по всем параметрам обскачут Оракла!" Потому и не спорю. С фанатами без мозгов спорить бесполезно.
Курдль (2005-12-13 10:38:00) [16]
> А у нас некоторые считают, что MSSQL круче оракла
Если мне лень спорить то бывает достаточно одного аргумента: "MS SQL - блокировщик" и на этом спор обычно заканчивается :)
(хотя это далеко не единственное преимущество оракла).
evvcom (2005-12-13 10:30:00) [17]
> Сайбэйс имеет в селекте и "If ... Else" и Case.
Ну так и надо было сразу Case и использовать, а if...else в селекте - это не стандарт. Дааааа... Каждый разработчик по-своему извращается (это я про разработчиков сайбейз). :)
> Люблю эту СУБД и считаю, что она оставила далеко позади MS SQL.
> Но с ораклом она все равно не сравнится. :(
А у нас некоторые считают, что MSSQL круче оракла, т.к. MSSQL сам решает некоторые задачи, а в оракле надо явно указать, как эту задачу решить! А для этого ж его надо понимать! Я уж с ними не спорю - бесполезно :)
Курдль (2005-12-13 10:23:00) [18]
> evvcom © (13.12.05 10:04) [15]
> Тогда уж на case. Case в стандарте имеется.
Согласен. Так удобнее.
А что сайбейс
> в селекте допускается конструкция "If ... Else" и нет Case?
Сайбэйс имеет в селекте и "If ... Else" и Case. Сайбэйс много чего имеет.
Люблю эту СУБД и считаю, что она оставила далеко позади MS SQL.
Но с ораклом она все равно не сравнится. :(
evvcom (2005-12-13 10:04:00) [19]
> "If ... Else" на "Decode",
Тогда уж на case. Case в стандарте имеется. А что сайбейс в селекте допускается конструкция "If ... Else" и нет Case?
Курдль (2005-12-13 09:55:00) [20]
> ANB © (12.12.05 17:57) [11]
> А на чем писали ?
На MS VS.
> > У меня задача - запросы максимально приближать к ANSI.
> Практика показывает, что бесполезная трата времени и сил.
> При переходе на другую СУБД все равно многое править приходится.
Моя практика показывает, что наоборот, это сильно облегчает работу.
Во-первых помогает глубже проникнуться идеологией SQL (это как писать сочинение на Русском, а не на "SMS-слэнге").
Во-вторых - позволяет оставлять неизменной структуру запроса, изменяя лишь некоторые ключевые слова.
Например, "IsNull" на "NVL", "If ... Else" на "Decode", "DateFormat" на "ToChar".
Конечно, в этом частном случае можно было бы и транзакт SQL привести к PL/SQL типа
where T1.T2_ID = T2.T2_ID(+)
where T1.T2_ID *= T2.T2_ID
А что делать, если возникнет необходимость перейти на еще какую-нибудь СУБД?
> evvcom © (13.12.05 09:01) [13]
> Максимально похоже:
> "...from T1 left outer join (T2 inner join T3 on T3.T2_ID
> = T2.T2_ID) on T2.T1_ID = T1.T1_ID"
Точно! Я тоже до этого же дошел и даже поделился такой мыслью на SQL.RU!