2011-01-11 4 views
0

삭제 된 레코드로 데이터베이스를 상속했습니다. 나는 뉴스 항목 테이블에서 일하고있다. 즉, 이러한 레코드가 삭제 된 일부 누락 된 ID가 있음을 의미합니다. 아카이브 (1000 's)에있는 뉴스 스토리를 연 다음 다음 및 이전 버튼을 사용하여 모든 뉴스 기사를 탐색 할 수 있습니다. 현재 삭제 된 다음 레코드로 이동하면 파일의 레코드 세트 종료가 발생하고 "뉴스 항목을 더 이상 사용할 수 없다"는 기본 메시지가 표시됩니다. 누락 된 레코드를 감지하고 다음 유효한 뉴스 기사 (예 : ID 등)로 이동할 수있는 방법이 있습니까? 이 사이트에 대해 오래된 ASP를 사용하고 있습니다. 레코드 집합을 탐색하는 동안이를 감지하는 방법이 있습니까? 아니면 이러한 유형의 기능이 데이터베이스에서 가져와야합니까, 아니면 트리거일까요? 어떤 도움을 주셔서 감사합니다.존재하지 않는 레코드 선택 (삭제됨) - 다음 유효한 레코드 선택

+0

당신이 숫자 ID를 사용하여 이러한 항목을 식별하고, 이전 및 다음 버튼은 단순히 추가하거나 하나를 뺄 경우, 즉, 그 말은하지 않는 항목 3 아무튼 경우 항목 2가 열리므로 이전 단추가 항목 2에 다시 연결됩니까? 현재 어떻게 작동합니까? – Rob

+1

SQL Server의 버전은 무엇입니까? –

답변

1

SQL Server 2005 이상에 대해서는 MSDN을 참조하십시오.

row_number을 사용하면 인접한 숫자 열을 만들 수 있습니다.

0

1) 프론트 엔드 ('레코드 세트 파일 끝')에 영향을 준다는 것을 알기 때문에 수동으로 식별자를 증가/감소시키고 DB에서 다른 레코드를 가져올 수 있습니다. 데이터베이스에 가지 않고도 할 수 있습니다. 그러나 행의 많은 레코드가 누락 된 경우 이는 매우 비 효과적 일 수 있습니다. 대신 데이터베이스에서 코드를 변경하는 것이 좋습니다.

이 같은 쿼리가 한 가정 :

SELECT * FROM News WHERE [email protected] 

@Id 당신이 가져 오기 위해 노력하고 식별자입니다. 대신 다음과 같은 내용을 갖게됩니다 :

이렇게하면 처음 사용 가능한 레코드를 선택할 수 있습니다. MIN 대신 MAX를 사용해야하고> = 대신 < = 대신 '이전'뉴스 항목을 사용해야합니다. 위의 예는 다음 뉴스 항목에 적용됩니다.

또한이 방법을 사용하면 찾고 있던 데이터 대신 데이터베이스에서 가져온 값을 기반으로 다음/이전 레코드에 대한 식별자를 증가/감소시켜야한다는 것을 잊지 마십시오. 예 : SQL 테이블에 다음 식별자가 있습니다 (1,5,12,21). Id = 1 인 뉴스 항목을 열었습니다. '다음'버튼은 Id> = 2를 찾고 Id = 5 인 레코드를 반환합니다. 열 때 '다음'버튼은 Id> = 6 (2가 아님)으로 레코드를 찾습니다.

다음 포인트는 가져 오려고하는 레코드의 식별자뿐만 아니라 찾고자하는 방향도 제공해야한다는 것입니다. 그리고이 매개 변수는 http 쿼리 문자열에도 전달되어야합니다.

또한이 방법은없는 매우 사용자 친화적 같은 항목이 표시됩니다 URL을 다음과 같이 모든 페이지 이후 수 있습니다 :
사이트/news.asp을 식 2 & 방향 = 다음
사이트/news.asp 아이디? = 3 & 방향 = 다음
사이트/news.asp? 아이디 = 4 & 방향 = 다음
사이트/news.asp? 다음 식 (5) & 방향 =

2) 그래서 어쩌면 더 많은 사용자 - 될 것입니다 어떤 레코드가 다음과 이전인지 미리 결정할 수 있습니다. c를 표시 할 때 유력한 기록.

SELECT (SELECT MAX(Id) FROM News WHERE Id<@Id) as previousId, (SELECT MIN(Id) FROM News WHERE Id>@Id) as nextId 

을하고 상응하여 '다음'& '이전'버튼에 대한 URL을 업데이트 :이 경우는 다음과 같이 쿼리를 실행해야합니다. 이전 예에서 id = 5 인 뉴스 항목을 열면 '이전'버튼이 Id = 1로 직접 이동하고 '다음'버튼이 Id = 12로 이동합니다.

두 번째 접근법은 변경 사항이 적게 적용될 수 있기 때문에 더욱 효과적입니다. 해당 레코드를 사용할 수없는 경우 회색으로 '다음'& '이전'링크를 구현할 수 있습니다. previousId 또는 nextId에 대한 질의에 의해 NULL이 리턴 됨으로써).

희망이 도움이 :)

3
SELECT TOP 1 * 
FROM news 
WHERE id >= @next_id 
ORDER BY 
     id 
관련 문제