답변:
없기. (개발할 때까지) 개발하지 않는 한 (MySQL은 오픈 소스이므로 누구나 기여할 수 있습니다.)
ANSI / ISO SQL WITH
키워드는 공통 테이블 표현식 (CTE)을 정의하는 데 사용되며 하나 또는 여러 개의 중첩 된 참조로 복잡한 쿼리를 단순화합니다. Oracle, Postgres, SQL-Server, DB2에서는 사용할 수 있지만 MySQL에서는 사용할 수 없습니다.
최종 쿼리 FROM
에는 공통 테이블 표현식에 대한 참조가 여러 번있을 수 있습니다 (보통 절에 있지만 다른 부분에있을 수 있음). 파생 테이블을 사용하여 MySQL에서 쿼리를 CTE없이 작성할 수 있지만 참조는 반복적으로 이루어져야합니다.
50 년대와 7 월에 태어난 모든 사람과 같은 해에 태어난 모든 사람의 수를 보여주는 바보 같은 쿼리의 예 :
WITH a AS
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
)
, b AS
( SELECT birthyear, COUNT(*) AS cnt
FROM a
GROUP BY birthyear
)
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM a JOIN b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
MySQL에서는 다음과 같이 쓸 수 있습니다.
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS a
JOIN
( SELECT birthyear, COUNT(*) AS cnt
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS aa
GROUP BY birthyear
) AS b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
파생 테이블에 대한 코드 중복에 주목하십시오 a
. 더 복잡한 쿼리에서는 코드를 여러 번 작성해야합니다.
그것은 작동하지만 WITH 절을 사용하는 이점을 제공하지 않는 것이 유감입니다. 즉, 동일한 쿼리를 여러 번 실행하지 않아야합니다 (복잡한 쿼리는 데이터베이스 엔진에 대해 시간이 오래 걸리고 매우 까다로울 수 있습니다. .
내가 제안 각 SELECT가 자신의 임시 테이블에 절을 원래의 정의 삽입, 쿼리 내에서 사용할 . MySQL에서 임시 테이블은 사용자 세션이 끝나면 자동으로 삭제됩니다.
편집하다:
방금 MySQL과 관련된 3 가지 해결 방법 을 분명히 보여주는 비슷한 스레드 에서이 답변을 보았습니다 .
/programming//a/1382618/2906290
세션을 계속하고 해당 리소스를 해제하려는 경우 임시 테이블을 만들고 삭제하는 MySQL 프로 시저 의 예 (구문의 예로 사용하겠습니다) : https : //.com/a/ 5553145/2906290