IT TIP

MySQL : FROM 절 제한에서 하위 쿼리로보기

itqueen 2020. 12. 15. 20:39
반응형

MySQL : FROM 절 제한에서 하위 쿼리로보기


MySQL 5.0에서 FROM 절에 하위 쿼리를 사용하여 뷰를 만들려고 할 때 왜 다음 오류가 발생합니까?

오류 1349 (HY000) : 뷰의 SELECT에 FROM 절에 하위 쿼리가 있습니다.

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

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

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


예제 쿼리 (댓글에 묻 혔음) :

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

많은 IN 쿼리는 (왼쪽 외부) 조인 및 일종의 IS (NOT) NULL로 다시 작성할 수 있습니다. 예를 들면

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

각 하위 쿼리에 대한보기를 만드는 것이 방법입니다. 매력처럼 작동합니다.


You can work around this by creating a separate VIEW for any subquery you want to use and then join to that in the VIEW you're creating. Here's an example: http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/

This is quite handy as you'll very likely want to reuse it anyway and helps you keep your SQL DRY.

ReferenceURL : https://stackoverflow.com/questions/206062/mysql-view-with-subquery-in-the-from-clause-limitation

반응형