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
솔루션 개요 :
- 각 하위 쿼리에 대한보기 만들기
- 하위 쿼리를 해당 뷰로 교체
솔루션 쿼리는 다음과 같습니다.
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
'IT TIP' 카테고리의 다른 글
WPF 레이블 가속기 키 비활성화 (텍스트 밑줄이 없음) (0) | 2020.12.15 |
---|---|
삽입 된 순서대로 사전에서 항목을 검색하는 방법은 무엇입니까? (0) | 2020.12.15 |
@@ IDENTITY, SCOPE_IDENTITY (), OUTPUT 및 기타 마지막 ID 검색 방법 (0) | 2020.12.15 |
매개 변수의 해시를 허용하는 루비 메소드 생성 (0) | 2020.12.15 |
C #에서 DateTime에 시간 추가 (0) | 2020.12.15 |