Предложение MySQL WITH WITH

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

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

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

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

Ответ 1

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

Здесь блог объявляет об этом: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

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


MySQL не поддерживает запросы, используя синтаксис WITH, определенный в SQL-99, также называемый Common Table Expressions.

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

Другие продукты РСУБД, которые поддерживают общие выражения таблиц:

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

Ответ 2

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

select * from (
    select * from table
) as Subquery

Ответ 3

У вас есть синтаксис справа:

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; Я не совсем уверен, когда эта функция может быть поддержана, но она отлично подходит для создания читаемых запросов на свертывание.

Ответ 4

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

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

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

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

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

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

Ответ 5

Основываясь на ответе от @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.

Ответ 6

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

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 ...;

Ответ 8

Подвыборы как значения обычно должны быть в круглых скобках.

Обновление: не знаю, какой синтаксис вы пытаетесь использовать. Не могли бы вы показать более полное выражение? CREATE VIEW принимает инструкцию SELECT, которая, afaik, может иметь WITH, но только там, где она была бы действительной в независимом SELECT.

Обновление 2: ошибка, я думал о CASE, а не о WITH. Googling не показывает какой-либо специальный синтаксис WITH для Oracle, кроме WITH WITH CHECK OPTION, который также поддерживает mysql. Пожалуйста, начните с описания того, что вы пытаетесь достичь?

Обновление 3: просто угадайте, вы имеете в виду что-то вроде этого:

выберите... из foo, (выберите aname avg (количество) как рейтинг от группы книг по имени) в качестве authorRating где...

Ответ 9

   WITH authorRating as (select aname, rating from book)
   SELECT aname, AVG(quantity)
   FROM authorRating
   GROUP BY aname