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

Модераторы: Pr0[)!9Y, Akina, JoeUser
Страницы: (14) « Первая ... 12 13 [14]  все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    Спасибо!!! Проверю
    "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
      ^D^ima
      PS. На будущее - не ленись указывать СУБД и её версию в КАЖДОМ вопросе...
      PPS. Чего проверять-то - вон он, линк на fiddle. Но предупреждаю сразу - если попадётся кольцо ссылок, будет плохо. Проверку я не делал.
      Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
      Есть претензии ко мне как к участнику? да ради бога.
      Не нравятся мои ответы? не читайте их.
      В общем, берегите себя. Нервные клетки не восстанавливаются.
        Akina
        Твой пример сломал мне мозг :wall:
        ExpandedWrap disabled
          WITH cte AS ( SELECT id id_k, id_p, id, p, money
                        FROM test
                        WHERE id_k IS NULL
                      UNION ALL
                        SELECT cte.id_k, test.id_p, test.id, test.p, test.money
                        FROM test, cte
                        WHERE cte.id = test.id_k )


        Это как вообще?

        До Union all понятно, а SELECT cte.id_k и FROM test, cte не ясно. Это какая-то рекурсия? Т.е. он доходит до FROM test, cte и что что вернет в cte? что было до UNION ALL?
        Сатанизм какой-то...
        "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
          Цитата ^D^ima @
          Это какая-то рекурсия?

          Точно. Таблица CTE накапливает записи, поставляемые запросом, и в то же время используется как источник данных для его второй части. Та часть запроса, что до UNION, выполняется один раз и в самом начале, выбирая некие записи в CTE. Затем выполняется вторая часть, много раз, при этом используются те записи из накопленных уже в CTE, которые ранее во второй части не использовались (т.е. при первом выполнении - вставленные первой частью, при втором - вставленные первой частью при первом выполнении, при третьем - ... и так продолжается до тех пор, пока на очередном витке ни одной записи второй частью не будет вставлено).

          Т.е. в данном случае первая часть выберет в СТЕ записи 2 и 4.
          Вторая часть, используя эти две записи, выберет записи 1 и 3 (по связи с записью 2).
          Следующее выполнение второй части ни одной записи не выберет (она использует в таблице CTE записи 1 и 3, но в таблице нет записей с таким значением поля ID_КорневойПроект).
          На этом накопление закончится. В CTE будут записи 2,4,1,3.
          Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
          Есть претензии ко мне как к участнику? да ради бога.
          Не нравятся мои ответы? не читайте их.
          В общем, берегите себя. Нервные клетки не восстанавливаются.
            Цитата ^D^ima @
            Это как вообще?

            До Union all понятно, а SELECT cte.id_k и FROM test, cte не ясно. Это какая-то рекурсия? Т.е. он доходит до FROM test, cte и что что вернет в cte? что было до UNION ALL?
            Сатанизм какой-то...

            Это обычный деревянный(древовидный) запрос, рекурсивный. Причем синтаксис в разных БД может немного отличаться.
              Цитата Wound @
              синтаксис в разных БД может немного отличаться

              Единственные известные мне различия - это:

              - одни СУБД требуют явного указания рекурсивности (WITH RECURSIVE), другим это не требуется;

              - одни СУБД допускают только два подзапроса в рекурсивном CTE, другие не ограничивают их количество;

              - одни СУБД допускают только UNION ALL, другие - и UNION DISTINCT (а при количестве подзапросов более 2 - и то, и другое в любом порядке);

              - одни СУБД требуют явной спецификации выходного набора, другие не против динамического формирования структуры.

              Есть ещё какие известные тебе различия? Чисто из любопытства и для познания...
              Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
              Есть претензии ко мне как к участнику? да ради бога.
              Не нравятся мои ответы? не читайте их.
              В общем, берегите себя. Нервные клетки не восстанавливаются.
                Цитата Akina @
                Единственные известные мне различия - это:

                Возможно, я просто сталкивался с ними довольно давненько уже, ньюансы подзабыл, если честно, помню только что пример с PostgresSQL у меня не пошел на MSSQL, пришлось немного модифицировать, чтоб завелся.
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script Execution time: 0,0960 ]   [ 15 queries used ]   [ Generated: 20.02.20, 20:55 GMT ]