На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> JOIN в Oracle 8 есть - или ещё нет???
    Всем здравствуйте!
    На Oracle 8 - ORA-00933, на Oracle 12 всё ОК.
    Это говорит о том, что восьмёрка не знает джойнов???
    Сообщение отредактировано: #SI# -

    Прикреплённый файлПрикреплённый файл1.png (17,37 Кбайт, скачиваний: 569)
      ЕМНИП Oracle поддерживать начал эту нотацию только с девятки.
      под восьмеркой приходилось пользоваться "(+)" для лефтов
        да, в старых ораклах join писался в where типа такого
        ExpandedWrap disabled
          select a.*, b.*
          from a,b
          where a.id=b.a_id;


        Цитата Anykey @
        под восьмеркой приходилось пользоваться "(+)" для лефтов

        (+) нужен для outer join :)

        PS: кстати для сложных запросов лучше и сегодня эту конструкцию использовать. Даже не знаю почему, но есть случаи когда работает правильнее и быстрее. Во всяком случае в 11.
          Спасибо!
            Цитата vladimir74 @
            да, в старых ораклах join писался в where типа такого

            Но указанный тобой пример - это CROSS JOIN.
            А LEFT JOIN работает по-другому.
              ExpandedWrap disabled
                 SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2  - аналогичен запросу:
                  SELECT * FROM tab,tab2  WHERE col1=col2 (+)
                 
                  SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2  - аналогичен запросу:
                  SELECT * FROM tab,tab2  WHERE col1 (+)=col2
                Bas, частные случаи совпадения конечно же могут быть.

                Но следует помнить, что в CROSS JOIN'е в директиве WHERE - указывается "по каком условию фильтровать". А в директиве ON - указывается "по какому условию клеить". Несколько иной функционал, не правда ли?
                  Для примера. Берем CROSS JOIN ...

                  user posted image

                  ... какой бы мы фильтр во WHERE не мастерили, следующего результата мы не получим:

                  user posted image
                    Цитата JoeUser @
                    Но указанный тобой пример - это CROSS JOIN.

                    может я забутался в абривиатурах, но мне всегда казалось что CROSS JOIN это вот так
                    ExpandedWrap disabled
                      with t1 as(
                      select 1 id, 'Ivan' name, 1 rid from dual union all
                      select 2 id, 'Michael' name, 2 rid from dual union all
                      select 3 id, 'Jon' name , 3 rid from dual union all
                      select 4 id, 'Luis' name, 4 rid  from dual
                      ),
                       t2 as(
                      select 1 id, 'Buro1' raum from dual union all
                      select 2 id, 'Buro2' raum from dual union all
                      select 3 id, 'Buro3' raum from dual
                      )
                      select * from t1,t2


                    Цитата JoeUser @
                    ... какой бы мы фильтр во WHERE не мастерили, следующего результата мы не получим:

                    разве не так?
                    ExpandedWrap disabled
                      with t1 as(
                      select 1 id, 'Ivan' name, 1 rid from dual union all
                      select 2 id, 'Michael' name, 2 rid from dual union all
                      select 3 id, 'Jon' name , 3 rid from dual union all
                      select 4 id, 'Luis' name, 4 rid  from dual
                      ),
                       t2 as(
                      select 1 id, 'Buro1' raum from dual union all
                      select 2 id, 'Buro2' raum from dual union all
                      select 3 id, 'Buro3' raum from dual
                      )
                      select * from t1,t2
                      where t1.rid=t2.id(+)
                      ;
                      господа, а зачем всегда что-то прописывать в where?
                      кросс джойн тем и отлчается что они ни по каким колонкам ни "клеится" и не "фильтруется"
                      а вот реализовать в старой нотации, без джойнов, full outer join одним where уже не получалось. всегда приходилось делать left union right.
                        Цитата Anykey @
                        господа, а зачем всегда что-то прописывать в where?

                        так я вроде так и написал.
                        Цитата Anykey @
                        а вот реализовать в старой нотации, без джойнов, full outer join одним where уже не получалось. всегда приходилось делать left union right.

                        через UNION можно было, что то типо этого (хотя да заморочно)
                        ExpandedWrap disabled
                          with t1 as(
                          select 1 id, 'name1' name, 1 rid from dual union all
                          select 2 id, 'name2' name, 2 rid from dual union all
                          select 3 id, 'name3' name , 3 rid from dual union all
                          select 4 id, 'name4' name , 4 rid from dual union all
                          select 5 id, 'name5' name , 7 rid from dual union all
                          select 6 id, 'name6' name , 8 rid from dual union all
                          select 7 id, 'name7' name, 9 rid  from dual
                          ),
                           t2 as(
                          select 1 id, 'Buro1' raum from dual union all
                          select 2 id, 'Buro2' raum from dual union all
                          select 3 id, 'Buro3' raum from dual union all
                          select 4 id, 'Buro4' raum from dual union all
                          select 5 id, 'Buro5' raum from dual
                          )
                           SELECT t1.*, t2.* FROM t1,t2
                             WHERE t1.rid=t2.id(+)
                          UNION ALL
                           SELECT t1.*, t2.* FROM t1,t2
                            WHERE t1.rid(+)=t2.id
                              AND t1.id is null;



                        PS: я в принципе люблю JOIN-ы т.к. они более понятны, но к сожалению работая со сложными запросами и большими таблицами приходится возвращаться к старому синтаксису.
                        Кстати в 11g тоже Join-ы долго фиксили, а в связке с XML вообще до 11.2.0.3 они нормально не работали. :(
                        Вот такие Ораклописцы злые :(
                          Цитата vladimir74 @
                          разве не так?

                          Нет, кросс-джоин клеит "всех-со-всеми". LEFT(или RIGHT) OUTER JOIN может клеить еще и NULL значения. Когда соответствия не найдено. В этом разница. В ряде случаев это важно.

                          Пример: есть стандартный перечень чего-то, по этому выполняется что-то, задача - посчитать сколько выполнилось. В случае с LEFT OUTER JOIN это решается правильно и изящно. В случае с CROSS JOIN мы найдем все выполненные хотя бы раз, но ... мы не найдем невыполненные! "Нули" тупо теряем. А оч часто это важно.
                            CROSS JOIN - формально это INNER JOIN без условий связывания. О чём вообще спор-то?
                              Цитата Akina @
                              CROSS JOIN - формально это INNER JOIN без условий связывания. О чём вообще спор-то?

                              о старом оракловском синтаксисе, я надеюсь :)
                              Цитата JoeUser @
                              Нет, кросс-джоин клеит "всех-со-всеми". LEFT(или RIGHT) OUTER JOIN может клеить еще и NULL значения. Когда соответствия не найдено. В этом разница. В ряде случаев это важно.


                              ну так возьми мои запросы и проверь, они же все действующие :)
                                Цитата vladimir74 @
                                ну так возьми мои запросы и проверь, они же все действующие

                                Не вижу необходимости. Ибо потратил вечерок на изучение) Потрать и ты)
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0443 ]   [ 16 queries used ]   [ Generated: 20.05.24, 05:26 GMT ]