오라클의 WITH WITH MySQL


답변:


16

없기. (개발할 때까지) 개발하지 않는 한 (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. 더 복잡한 쿼리에서는 코드를 여러 번 작성해야합니다.


반복 (코드 중복)을 피하려면 변수와 임시 테이블을 사용하는 것이 더 좋지 않습니까?
Pacerier

코드 중복에 대해 걱정하지 않지만 성능상의 이유로 임시 테이블이있는 버전을 고려하고 시도 할 것입니다.
ypercubeᵀᴹ

1
왜 코드 복제에 대해 걱정하지 않습니까? 이것은 완전히 지저분하고 건조 하지 않습니다  .
Pacerier

1
@Pacerier DRY가 항상 DB 코드와 관련이있는 것은 아닙니다.
JNK

1
@Pacerier 나는 그것이 아니라면 놀라지 않을 것입니다. DB 엔진은 올바른 결과를 반환하는 것을 보장하면서 가장 효과적인 것이 무엇인지에 대한 정확한 추측을해야합니다. 일반적으로 임시 테이블은 훌륭하지만 DRY는 사용자 정의 함수와 같은 다른 측면에서 DB의 끔찍한 성능으로 이어집니다.
JNK

2

그것은 작동하지만 WITH 절을 사용하는 이점을 제공하지 않는 것이 유감입니다. 즉, 동일한 쿼리를 여러 번 실행하지 않아야합니다 (복잡한 쿼리는 데이터베이스 엔진에 대해 시간이 오래 걸리고 매우 까다로울 수 있습니다. .

내가 제안 각 SELECT가 자신의 임시 테이블에 절을 원래의 정의 삽입, 쿼리 내에서 사용할 . MySQL에서 임시 테이블은 사용자 세션이 끝나면 자동으로 삭제됩니다.

편집하다:

방금 MySQL과 관련된 3 가지 해결 방법 을 분명히 보여주는 비슷한 스레드 에서이 답변을 보았습니다 .

  • 임시 테이블
  • 파생 테이블
  • 인라인 뷰 (유효하게 WITH 절이 나타내는 것-상호 교환 가능)

/programming//a/1382618/2906290

세션을 계속하고 해당 리소스를 해제하려는 경우 임시 테이블을 만들고 삭제하는 MySQL 프로 시저 의 예 (구문의 예로 사용하겠습니다) : https : //.com/a/ 5553145/2906290

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.