뷰에서 ORDER BY 절에 대한 대안은 무엇입니까?


12

이 질문은이 사이트에 있어야했습니다. :)

ORDER BY는이보기를 사용할 때 여러 주문을 할 수 있기 때문에보기에서 사용하는 것이 금지되어 있습니다.

예를 들어이 제한을 우회하는 방법이 TOP 99.999999 PERCENT있다는 것을 알고 있지만 해킹하는 방법이 아니라 모범 사례가 무엇인지 알고 싶습니다.

따라서 개인적인 용도로 데이터베이스에 뷰를 만들려면 데이터베이스에 연결하고 고정 및 정렬 된 데이터를보고 싶습니다. 뷰를 주문할 수 없으면 어떻게해야합니까?

현재 SQL Server DB에는 TOP해킹 이있는 뷰가 있으며 많이 사용하고 있지만 잘못 느낍니다.


1
왜 TOP 100 %가 아닌가?
garik

@garik- gbn의 링크를 올바르게 이해하면 주문을 보장 하지 않기 때문에 . 그것은 단지 더 간결 잘못된 답변입니다
잭 topanswers.xyz 시도라고

1
@ 잭 더글러스 그것은 대답이 아니었다, 그것은 최고 99.999에 대한 의견이었다 ...
garik

@garik-SQL Server 2008에서는 TOP 100 PERCENT가 무시되며 99 만 사용하고 있습니다. 수정되었지만 내 버전이 업데이트되지 않은 것 같습니다.
yellowblood

1
이것은 기술적 제한이 아닙니다. 이것은 의도적으로 설계된 동작입니다. 따라서 모든 해결 방법이 해킹처럼 느껴집니다. 뷰에 대한 쿼리에서 순서를 정하십시오. 순서는 데이터 모음 (예 : 뷰 또는 테이블)이 아닌 결과 집합 (예 : 쿼리 결과)에 적용됩니다.
Nick Chammas

답변:


2

뷰는 일련의 행이어야하기 때문에 "정렬 된"뷰는 없습니다. 고정 주문을 원하면 저장 프로 시저를 사용하십시오.


이것은 뷰 정의 내에서 순서를 지정할 수없는 이유 를 설명하는 답변입니다 . 정의에 따라 세트에는 순서가 없습니다. 그러나 TOP와 결합 ORDER BY하면 순서가 어떤 행이 "상단"에 영향을 미치므로 새 세트를 정의하게됩니다. 이것이 보기 정의에서 TOP사용할 수있게하는 이유 ORDER BY입니다.
Nick Chammas

9

가장 바깥 쪽 ORDER BY 만이 주문을 보장합니다

  • 중간 또는 내부 ORDER BY는 무시됩니다.
    보기에 ORDER BY가 포함됩니다.
  • 어떤 테이블에도 묵시적 순서가 없습니다.
  • 해당 테이블의 인덱스 (클러스터 또는 클러스터되지 않은)에서 내재 된 순서가 없습니다.

연결

ORDER BY는 쿼리의 가장 바깥 쪽 SELECT 문에 대해서만 정렬 된 결과를 보장합니다. 예를 들어 다음과 같은 뷰 정의를 고려하십시오. (이 질문과 일치하는 예를 따르십시오)


설명에 감사드립니다. 그러나 내가 찾고있는 대답은 아닙니다.
yellowblood

3

ORDER BY를 뷰의 출력에 추가하십시오.

  SELECT whatever FROM MYVIEW ORDER BY whatever

1
클러스터형 인덱스에 의한 암시 적 순서는 없습니다. -1.
gbn

@SqlACID-좋은 편집, -1 대신 +1 :)
Jack은 topanswers.xyz를 시도 함

이것은 뷰를 쿼리 할 때마다 order by 절을 다시 작성해야한다는 것을 의미합니다. 뷰에서 order를 사용할 때 피하려고하는 것입니다.
yellowblood

dportas가 말했듯이 쿼리 주위에 저장된 proc 래퍼는 작동하지만 원하는 것은 아닙니다.
SqlACID

실제로 저장 프로 시저를 시도했지만 쿼리하거나 조작하기에 쉽고 빠르지 않았습니다. Meh.
yellowblood
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.