이 포럼의 다른 곳에서 논의 된 바와 같이 (예 : 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 불만인지 여부를 결정할 것인가? 두 번째 버전을 제작하기에 충분히 편한 느낌이 들겠습니까?
MySQL을 중점적으로 다루는 경우 MySQL 웹 사이트에서 인용 한 내용은 무엇입니까? "일반적으로 사용자 변수에 값을 할당하고 같은 문 내에서 값을 읽으면 안됩니다. 결과는 예상 할 수 있지만 보장되지는 않습니다. 사용자 변수가 포함 된 표현식에 대한 평가 순서는 정의되지 않았으며 특정 구문에 포함 된 요소에 따라 변경 될 수 있습니다 ... "두 번째 쿼리에서 정확히 수행 한 내용이 아닙니까? , 즉 할당 및 외부 쿼리에서 col1과 col2를 읽고? – asmahani
성명서는 MySQL 제품에 대한 면책 사항입니다. SQL 표준이 허용하는 방식으로 구현을 변경하면 해당 항목으로 인해 화를 내지 않아야합니다. :-) –