문제

MySQL 5.0에서 FROM 절에서 하위 쿼리가있는 뷰를 작성하려고 할 때 다음 오류가 발생하는 이유는 무엇입니까?

오류 1349 (hy000) : View의 Select는 From Clause에 하위 쿼리를 포함합니다.

이것이 MySQL 엔진의 제한이라면 왜이 기능을 구현하지 않았습니까?

또한이 제한에 대한 좋은 해결 방법은 무엇입니까?

From Clause의 하위 쿼리에 대해 작동하는 해결 방법이 있습니까? 아니면 From Clause에서 하위 쿼리를 사용하지 않고는 표현할 수없는 쿼리가 있습니까?


예제 쿼리 (의견에 묻혀 있음) :

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
도움이 되었습니까?

해결책

귀하의 의견의 쿼리는 다음과 같이 작성할 수 없습니다.

SELECT u1.name as UserName from Message m1, User u1 
  WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3

MySQL의 하위 쿼리와 함께 알려진 속도 문제에도 도움이됩니다.

다른 팁

나는 같은 문제가 있었다. 2009 년부터 2011 년까지 레코드가있는 테이블에서 가장 최근의 정보를 보여주기 위해보기를 만들고 싶었습니다. 원래 쿼리는 다음과 같습니다.

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

솔루션 개요 :

  1. 각 하위 퀘스트에 대한보기를 만듭니다
  2. 하위 쿼리를 이러한보기로 바꾸십시오

솔루션 쿼리는 다음과 같습니다.

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;

MySQL 5.0.45에서는 많은 속도 페널티없이 제대로 작동합니다 (원래 하위 쿼리 선택을 실행하는 것과 비교할 때).

알려진 문제 인 것 같습니다.

http://dev.mysql.com/doc/refman/5.1/en/unnamed-views.html

http://bugs.mysql.com/bug.php?id=16757

쿼리의 많은 사람들은 (왼쪽 외부) 결합하고 어떤 종류의 숫자가 아님을 다시 작성할 수 있습니다. 예를 들어

SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)

다시 작성할 수 있습니다

SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID

또는

SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)

할 수 있습니다

SELECT FOO.* FROM FOO 
LEFT OUTER JOIN FOO2 
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL

각 하위 퀘스트에 대한보기를 작성하는 것은 갈 길입니다. 매력처럼 작동했습니다.

사용하려는 하위 쿼리에 대한 별도의보기를 만들어 만들 수 있습니다. 예는 다음과 같습니다.http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/

어쨌든 재사용하고 싶을 가능성이 높고 SQL을 건조하게 유지하는 데 도움이되므로 매우 편리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top