Estou convertendo todas as minhas consultas do SQL Server para MySQL e todas as minhas consultas que contêm WITH
estão falhando. Aqui está um exemplo:
WITH t1 AS
(
SELECT article.*, userinfo.*, category.*
FROM question
INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
INNER JOIN category ON article.article_categoryid = category.catid
WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3
Respostas:
O MySQL anterior à versão 8.0 não oferece suporte à cláusula WITH (CTE no jargão do SQL Server; Subquery Factoring no Oracle), então você precisa usar:
A solicitação do recurso remonta a 2006.
Como mencionado, você forneceu um exemplo pobre - não há necessidade de realizar uma subseleção se você não estiver alterando a saída das colunas de forma alguma:
Aqui está um exemplo melhor:
fonte
A equipe de desenvolvedores do Mysql anunciou que a versão 8.0 terá expressões de tabela comuns no MySQL (CTEs) . Portanto, será possível escrever consultas como esta:
fonte
No Sql, a instrução with especifica um conjunto de resultados nomeado temporário, conhecido como expressão de tabela comum (CTE). Pode ser usado para consultas recursivas, mas, neste caso, especifica como subconjunto. Se o mysql permitir subselectes, eu tentaria
fonte
Segui o link compartilhado por lisachenko e encontrei outro link para este blog: http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html
A postagem apresenta maneiras de emular os 2 usos do SQL WITH. Explicação realmente boa sobre como eles funcionam para fazer uma consulta semelhante a SQL WITH.
1) Use WITH para que você não precise realizar a mesma subconsulta várias vezes
2) As consultas recursivas podem ser feitas com um procedimento armazenado que torna a chamada semelhante a uma recursiva com consulta.
E este é o código ou procedimento armazenado
fonte
O recurso 'Common Table Expression' não está disponível no MySQL, então você tem que fazer uma visualização ou tabela temporária para resolver, aqui eu usei uma tabela temporária.
O procedimento armazenado mencionado aqui resolverá sua necessidade. Se eu quiser obter todos os membros da minha equipe e seus membros associados, este procedimento armazenado ajudará:
Código:
Isso pode ser chamado usando:
fonte
Esse recurso é chamado de expressão de tabela comum http://msdn.microsoft.com/en-us/library/ms190766.aspx
Você não será capaz de fazer a coisa exata no mySQL, a coisa mais fácil provavelmente seria fazer uma visão que espelhe essa CTE e apenas selecionar a partir da visão. Você pode fazer isso com subconsultas, mas o desempenho será muito ruim. Se você encontrar CTEs que fazem recursão, não sei como seria capaz de recriar isso sem usar procedimentos armazenados.
EDITAR: Como eu disse em meu comentário, esse exemplo que você postou não precisa de um CTE, então você deve ter simplificado para a pergunta, pois pode ser escrito apenas como
fonte
CREATE/DROP VIEW
,) e você pode conceder privilégios a uma visualização.Gostei da resposta de @Bad neste tópico , mas queria uma maneira de salvar os resultados para processamento posterior (MySql 8):
Que produz:
fonte