MySQL: Ver com subconsulta na DE Limitação Cláusula
-
03-07-2019 - |
Pergunta
No MySQL 5.0 porque ocorre o seguinte erro ao tentar criar uma vista com uma subconsulta na cláusula FROM?
ERROR 1349 (HY000): de Ver SELECT contiver uma subconsulta na cláusula FROM
Se esta é uma limitação do motor MySQL, então por que não eles implementaram esse recurso ainda?
Além disso, quais são algumas boas soluções para esta limitação?
Há soluções temporárias que o trabalho para qualquer subconsulta na cláusula FROM ou existem algumas consultas que não podem ser expressas sem usar uma subconsulta na cláusula FROM?
Um exemplo de consulta (foi enterrado em um comentário):
SELECT temp.UserName
FROM (SELECT u1.name as UserName, COUNT(m1.UserFromId) as SentCount
FROM Message m1, User u1
WHERE u1.uid = m1.UserFromId
Group BY u1.name HAVING SentCount > 3 ) as temp
Solução
Não foi possível a consulta no seu comentário apenas ser escrita como:
SELECT u1.name as UserName from Message m1, User u1
WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3
Isso também deve ajudar com os problemas de velocidade conhecidos com subconsultas no MySQL
Outras dicas
Eu tive o mesmo problema. Eu queria criar uma visão para mostrar informações do ano mais recente, de uma tabela com os registros de 2009 a 2011. Aqui está a consulta original:
SELECT a.*
FROM a
JOIN (
SELECT a.alias, MAX(a.year) as max_year
FROM a
GROUP BY a.alias
) b
ON a.alias=b.alias and a.year=b.max_year
Esboço de solução:
- criar uma visão para cada subconsulta ??li>
- substituir subconsultas com aquelas vistas
Aqui está a consulta solução:
CREATE VIEW v_max_year AS
SELECT alias, MAX(year) as max_year
FROM a
GROUP BY a.alias;
CREATE VIEW v_latest_info AS
SELECT a.*
FROM a
JOIN v_max_year b
ON a.alias=b.alias and a.year=b.max_year;
Ele funciona muito bem em MySQL 5.0.45, sem muito de uma penalidade de velocidade (em comparação com a execução o sub-consulta original escolha, sem quaisquer pontos de vista).
Parece ser um problema conhecido.
http://dev.mysql.com/doc/ refman / 5.1 / en / Sem nome-views.html
http://bugs.mysql.com/bug.php?id=16757
Muitas consultas in pode ser re-escrita como (externa esquerda) se junta e um (não) é NULL de algum tipo. por exemplo
SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)
pode ser re-escrita como
SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID
ou
SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)
pode ser
SELECT FOO.* FROM FOO
LEFT OUTER JOIN FOO2
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL
criar uma visão para cada subconsulta é o caminho a percorrer. Tenho que trabalhar como um encanto.
Você pode contornar isso criando uma exibição separada para qualquer subconsulta que você deseja usar e, em seguida, juntar-se a que, na opinião que você está criando. Aqui está um exemplo: http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/
Este é bastante útil como você vai muito provavelmente quer reutilizá-lo de qualquer maneira e ajuda a manter o SQL DRY.