2013-06-27 5 views
1

이 포럼의 다른 곳에서 논의 된 바와 같이 (예 : here) MySQL의 변수를 사용하여 MS SQL Server에서 row_number()를 (order by ... order by ... by partition) 기능을 에뮬레이트 할 수 있습니다. 예를 들어, 다음과 같은 코드 :MySQL에서 MS SQL Server ROW_NUMBER() 기능을 에뮬레이트하기위한 변수의 신뢰성과 ANSI-SQL 준수?

SELECT 
    col1, 
    col2, 
    ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col3 DESC) AS rowNum 
FROM Table1 

은 다음과 같이 MySQL의에서 구현 될 수있다 :

SELECT 
    @rowNum := 
     CASE 
      WHEN col1<>@col1 OR col2<>@col2 THEN 1 
      ELSE @rowNum+1 
     END rowNum 
    , @col1 := col1 col1 
    , @col2 := col2 col2 
    FROM 
    (SELECT @col1 := 'xxx', @col2 := 'yyy', @rowNum := 0) a, 
    (SELECT col1, col2, col3 FROM Table1 ORDER BY col1, col2, col3 DESC) b 

이 (그것이 일을 피할 수 있기 때문에 자기를 조인) 매우 빠른 반면, 아직 나는 주저 이동성이있을 수도 있고 그렇지 않을 수도있는 쿼리 실행 계획에 대한 자세한 가정을 만들기 때문에 이것을 프로덕션 환경에 적용 할 수도 있습니다. 특히, 가정한다 :

1) 외부의 요청에 의한 그들의 정렬 된 순서로 처리되는 'B'표 행

2 외부 쿼리의 열을 왼쪽에서 오른쪽으로 계산된다) (즉 ROWNUM -> col1 -> col2

이러한 가정은 필자가 익숙한 SQL 구문의 일반적인 추상화를 깨뜨리는 것처럼 보입니다. 또한이 쿼리는 프로그래머가 col1 및 col2에 제공하는 초기 값 Table1에 존재하지 않는다. 다시 말하지만 이것은 잘못된 생각이다. 이것은 ANSI SQL 호환 (92 또는 99)이라는 후자의 형식인가, 아니면 MySQL의 기능인가? 명확한 소스 란 무엇인가? 주어진 구문이 ANSI SQL 불만인지 여부를 결정할 것인가? 두 번째 버전을 제작하기에 충분히 편한 느낌이 들겠습니까?

답변

0

아니요, MySQL 솔루션은 표준 SQL이 아닙니다. MySQL 사용자 변수는 ANSI/ISO SQL의 확장입니다.

SQL-99 Complete, Really은 사람이 읽을 수있는 방식으로 SQL 사양을 설명하는 무료 온라인 리소스입니다. the book by the same name이라는 저자의 허가를 받아 게시 한 온라인 버전입니다.

그러나 SQL : 2003 이상에 대한 유사한 리소스를 알지 못합니다. 너는 purchase the specification documents from ISO 일거야. 그들은 저렴하지 않으며, 그들은 마른 독서입니다.

IMHO, 100 % 이식성이고 언어 추상화를 준수하는 SQL로 제한하려고하면 너무 제한적입니다. 예를 들어 의 모든 SQL 데이터 유형이 RDBMS의 모든 브랜드에서 정확히 동일하게 구현되고 언어 사양과 정확히 일치하는지 확인해보십시오. 나는 하나도 찾지 못했다.

+0

MySQL을 중점적으로 다루는 경우 MySQL 웹 사이트에서 인용 한 내용은 무엇입니까? "일반적으로 사용자 변수에 값을 할당하고 같은 문 내에서 값을 읽으면 안됩니다. 결과는 예상 할 수 있지만 보장되지는 않습니다. 사용자 변수가 포함 된 표현식에 대한 평가 순서는 정의되지 않았으며 특정 구문에 포함 된 요소에 따라 변경 될 수 있습니다 ... "두 번째 쿼리에서 정확히 수행 한 내용이 아닙니까? , 즉 할당 및 외부 쿼리에서 col1과 col2를 읽고? – asmahani

+0

성명서는 MySQL 제품에 대한 면책 ​​사항입니다. SQL 표준이 허용하는 방식으로 구현을 변경하면 해당 항목으로 인해 화를 내지 않아야합니다. :-) –