복붙노트

[SQL] MySQL의 : 절 제한의 FROM에서 하위 쿼리와보기

SQL

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

5.0에서 이유를 다음과 같은 오류가 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

해결법

  1. ==============================

    1.쿼리는 그대로 쓸 수 없습니다 :

    쿼리는 그대로 쓸 수 없습니다 :

    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은 서브 쿼리로 알려진 속도 문제와 그해야 또한 도움

  2. ==============================

    2.저도 같은 문제가 있었다. 나는 최근 연도의 정보를 표시 여기에 원래 쿼리의 2011 년 2009 년에서 레코드가있는 테이블에서 할 수있는 뷰를 만들고 싶었 :

    저도 같은 문제가 있었다. 나는 최근 연도의 정보를 표시 여기에 원래 쿼리의 2011 년 2009 년에서 레코드가있는 테이블에서 할 수있는 뷰를 만들고 싶었 :

    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
    

    솔루션의 개요 :

    여기에 솔루션 쿼리는 다음과 같습니다

    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에서 잘 작동 (실행 비교 원래 하위 쿼리 어떤 의견없이 선택).

  3. ==============================

    3.알려진 문제로 나타납니다.

    알려진 문제로 나타납니다.

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

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

    (외부 왼쪽)이 조인과는 어떤 종류의 (NOT) NULL IS로 많은 IN 쿼리 재 작성 될 수 있습니다. 예를 들면

    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
    
  4. ==============================

    4.각 하위 쿼리에 대한 뷰를 생성하는 길을 가야하는 것입니다. 매력처럼 작동을 얻었다.

    각 하위 쿼리에 대한 뷰를 생성하는 길을 가야하는 것입니다. 매력처럼 작동을 얻었다.

  5. ==============================

    5.당신은 당신이 사용하고 만들고있는보기에 그에 가입하려는 하위 쿼리에 대해 별도의 뷰를 생성하여이 문제를 해결할 수 있습니다. 다음은 그 예이다 : http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/

    당신은 당신이 사용하고 만들고있는보기에 그에 가입하려는 하위 쿼리에 대해 별도의 뷰를 생성하여이 문제를 해결할 수 있습니다. 다음은 그 예이다 : http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/

    이것은 당신이 매우 높다 어쨌든 그것을 재사용 할 수 있습니다로 매우 편리하고 당신이 당신의 SQL DRY을 유지하는 데 도움이됩니다.

  6. from https://stackoverflow.com/questions/206062/mysql-view-with-subquery-in-the-from-clause-limitation by cc-by-sa and MIT license