Предложение «С» MySQL - PullRequest
83 голосов
/ 28 ноября 2008

Я пытаюсь использовать MySQL для создания представления с предложением «WITH»

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname

Но, похоже, MySQL не поддерживает это.

Я думал, что это довольно стандартно, и я уверен, что Oracle поддерживает это. Есть ли способ заставить MySQL использовать предложение WITH? Я пробовал это с MyISAM и движком innoDB. Оба они не работают.

Ответы [ 8 ]

92 голосов
/ 28 ноября 2008

Обновление: в MySQL 8.0 наконец-то появилась функция общих табличных выражений, включая рекурсивные CTE.

Вот блог, объявляющий об этом: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

Ниже приведен мой более ранний ответ, который я первоначально написал в 2008 году.


MySQL не поддерживает запросы с использованием синтаксиса WITH, определенного в SQL-99, также называемого Общими выражениями таблиц.

Это запрос функции для MySQL с января 2006 года: http://bugs.mysql.com/bug.php?id=16244

Другие продукты RDBMS, которые поддерживают общие табличные выражения:

Другие базы данных, в которых отсутствует поддержка предложения WITH (по состоянию на февраль 2014 года):

13 голосов
/ 12 февраля 2012

Вас может заинтересовать что-то вроде этого:

select * from (
    select * from table
) as Subquery
11 голосов
/ 14 мая 2009

У вас правильный синтаксис:

WITH AuthorRating(AuthorName, AuthorRating) AS
   SELECT aname         AS AuthorName,
          AVG(quantity) AS AuthorRating
   FROM Book
   GROUP By Book.aname

Однако, как уже упоминали другие, MySQL не поддерживает эту команду. WITH был добавлен в SQL: 1999; самая новая версия стандарта SQL - SQL: 2008. Вы можете найти дополнительную информацию о базах данных, поддерживающих различные функции SQL: 1999, в Wikipedia .

MySQL традиционно немного отстает в поддержке стандарта SQL, тогда как коммерческие базы данных, такие как Oracle, SQL Server (в последнее время) и DB2, следуют им чуть более внимательно. PostgreSQL, как правило, также достаточно совместим со стандартами.

Вы можете посмотреть на дорожную карту MySQL; Я не совсем уверен, когда эта функция может поддерживаться, но она отлично подходит для создания читаемых сводных запросов.

7 голосов
/ 28 ноября 2008

Oracle поддерживает СО.

Это будет выглядеть так.

WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'

@ ysth WITH трудно гуглить, потому что это обычное слово, обычно исключаемое из поисков.

Вы хотели бы взглянуть на документы SELECT , чтобы увидеть, как работает факторинг подзапроса.

Я знаю, что это не отвечает ОП, но я устраняю любую путаницу, которая могла начаться.

2 голосов
/ 01 ноября 2013

Опираясь на ответ @Mosty Mostacho, вот как вы можете сделать что-то эквивалентное в MySQL для конкретного случая определения того, какие записи не существуют в таблице и отсутствуют в любой другой базе данных.

select col1 from (
   select 'value1' as col1 union
   select 'value2' as col1 union
   select 'value3' as col1
) as subquery
left join mytable as mytable.mycol = col1
where mytable.mycol is null
order by col1

Возможно, вы захотите использовать текстовый редактор с возможностями макросов для преобразования списка значений в предложение select union в кавычках.

1 голос
/ 11 июня 2017

MariaDB теперь поддерживает WITH. MySQL на данный момент нет. https://mariadb.com/kb/en/mariadb/with/

1 голос
/ 26 февраля 2013

Вы когда-нибудь пробовали Temporary Table? Это решило мою проблему:

create temporary table abc (
column1 varchar(255)
column2 decimal
);
insert into abc
select ...
or otherwise
insert into abc
values ('text', 5.5), ('text2', 0815.8);

Затем вы можете использовать эту таблицу для каждого выбора в этом сеансе:

select * from abc inner join users on ...;
0 голосов
/ 06 июня 2019
   WITH authorRating as (select aname, rating from book)
   SELECT aname, AVG(quantity)
   FROM authorRating
   GROUP BY aname
...