2012-02-16 2 views
3

엔티티의 고유 한 이름을 포함하는 identifier이라는 varchar() 필드가있는 테이블이 있습니다.주어진 문자열 값 "주위에"행을 검색하려면 어떻게해야합니까?

나는 테이블을 검색하고 해당 식별자의 양쪽에 주어진 식별자가 인 행을 찾으려고합니다. 알파벳순으로 정렬됩니다 (즉, 검색된 식별자와 측면).

SQL Server 2005에서이를 공식화하는 가장 좋은 방법은 무엇입니까? 나는 이것을 할 수있는 어떤 마법이 있다고 생각하지만, 이런 종류의 일을하기위한 어떤 go-by 쿼리도 찾지 못하고있다. 지금까지 얻을 수

이것은 가까운이지만, 성능은 끔찍한입니다 :

WITH 
    allrows AS (
    SELECT *, ROW_NUMBER() OVER(ORDER BY identifier DESC) AS RN 
     FROM mytable 
), 
    centerrow AS (
    SELECT RN AS CRN FROM allrows WHERE identifier = 'MyValue' 
) 
SELECT * FROM allrows, centerrow 
WHERE RN BETWEEN (centerrow.CRN - 10) AND (centerrow.CRN + 10) 

표는 2 백만 기록을 가지고 있으며, 식별자 필드는 한 1000 자 등이 될 수 있습니다.

답변

2

이 답변뿐만 아니라

declare @e table(identifier varchar(5)) 
insert @e values (0),(1),(2),(3),(4) 

SELECT * FROM(
SELECT top 2 * 
FROM @e WHERE 
identifier >= '2' 
ORDER BY identifier asc) a 
UNION ALL 
SELECT * FROM (
SELECT top 1 * 
FROM @e 
WHERE identifier < '2' 
ORDER BY identifier desc) b 
+0

UNION을 고려하지 않았지만, 내 머리가 단일 SELECT 내에서 그것을 시도하는 데 막혔습니다. 최종 결과 집합을 정렬 처리하기 때문에 다른 유사한 것에 비해이 대답을 선택했습니다. – richardtallent

+0

이게 더 "컴파일러 친화적 인"이유는 무엇입니까? 나는 정렬 요구 사항을 놓쳤다. 그러나 나는 이것이 "컴파일러 친화적 인"방식으로 어떻게 다른지를 볼 수 없다. 사실, 정렬 요구 사항을 추가하는 것 이외에도 copypasta가있을 수 있습니다. –

+0

@ PittsburghDBA 귀하의 스크립트가 컴파일되지 않습니다. 그러나 스크립트는 그대로 유효하지 않습니다. –

5
SELECT TOP 11 * FROM MyTable WHERE identifier >= 'My Value' ORDER BY identifier ASC 
UNION ALL 
SELECT TOP 10 * FROM MyTable WHERE identifier < 'My Value' ORDER BY identifier DESC 
+0

내 첫번째 생각 좀 더 compilerfriendly입니다. –

+0

'식별자'에 오름차순 및 내림차순 색인을 모두 보유하고자 할 수 있습니다. – HABO

관련 문제