Как преобразовать запрос MSSQL CTE в MySQL?

в моей схеме MySQL у меня есть таблица category(id, parentid, name)

В MSSQL у меня есть этот запрос CTE (для построения дерева категорий снизу вверх для предоставленного идентификатора категории:

with CTE (id, pid, name) 
as
(
    select id, parentid as pid,name
    from category
    where id = 197
      union all
        select CTE.pid as id , category.parentid as pid, category.name
        from CTE 
          inner join category 
            on category.id = CTE.pid
 )
 select * from CTE 

Как «преобразовать» этот запрос в MySQL?


person Tony    schedule 12.01.2012    source источник


Ответы (4)


К сожалению, MySQL не поддерживает CTE (Common Table Expressions). Это давно назрело ИМО. Часто вместо этого можно просто использовать подзапрос, но этот конкретный CTE является рекурсивным: он ссылается на себя внутри запроса. Рекурсивные CTE чрезвычайно полезны для иерархических данных, но опять же: MySql их вообще не поддерживает. Вы должны реализовать хранимую процедуру, чтобы получить те же результаты.

Мой предыдущий ответ должен стать хорошей отправной точкой:

Создание дерева на основе глубины из иерархических данных в MySQL (без CTE)

person Jon Black    schedule 12.01.2012
comment
@ f00, так они когда-нибудь это реализуют? Или ответ никогда? - person Pacerier; 20.01.2015

К счастью, в этом больше нет необходимости, так как MySQL, начиная с 8.0.1 поддерживает CTE.

person Hubbitus    schedule 04.08.2017
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. – Из обзора - person Jonathan; 04.08.2017
comment
@Jonathan Но это отвечает на вопрос :) - person Kuba hasn't forgotten Monica; 04.08.2017
comment
@KubaOber Вы правы - мне, вероятно, следовало пометить вместо этого ответ только по ссылке. Вы действительно должны добавить некоторый код, чтобы объяснить, как это работает, а не просто ссылаться на веб-сайт. Таким образом, меньше шансов, что его пометят и проголосуют против. Как только вы это сделаете, оставьте комментарий, и я отзову свой комментарий. - person Jonathan; 04.08.2017
comment
На самом деле я ожидаю, что теперь он должен работать как есть. Если при выполнении этого запроса в MySQL есть какие-то другие проблемы, то вопрос следует уточнить с деталями. - person Hubbitus; 04.08.2017

к сожалению, MYSQl или XAMPP (MARIADB) mysql не поддерживает CTE (ОБЩИЕ ТАБЛИЧНЫЕ ВЫРАЖЕНИЯ), для этого вам придется использовать вложенные запросы.

для получения дополнительной информации нажмите на ссылку ниже: -

https://mariadb.com/kb/en/library/with/

person NupzNupz    schedule 11.07.2018
comment
Пожалуйста, включите в свой ответ важную информацию со связанного сайта - ссылки не так надежны. - person CertainPerformance; 11.07.2018

Пожалуйста, проверьте, какую версию MySQL вы используете SELECT VERSION(); Если это 8 или выше, вы можете продолжить мой комментарий. В MySQL 8.0, MariaDB 10.2 и более поздних версиях вы можете использовать рекурсивные CTE:

WITH RECURSIVE CTE (id, pid, name) AS (
    select id, parentid as pid,name
from category
where id = 197
  union all
    select CTE.pid as id , category.parentid as pid, category.name
    from CTE 
      inner join category 
        on category.id = CTE.pid
)
select * from CTE ;

Обратите внимание, что CTE ограничены cte_max_recursion_depth (по умолчанию 1000, максимум 4 294 967 295 (2³²−1)) в MySQL и max_recursive_iterations (по умолчанию 4 294 967 295) в MariaDB.

Вы можете увеличить лимит, выполнив:

SET cte_max_recursion_depth = 4294967295;

Это повлияет только на ваш текущий сеанс и не будет сохранено.

person Sidrah    schedule 12.02.2021