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
Foi útil?

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:

  1. criar uma visão para cada subconsulta
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top