2009-06-25 5 views
0

MS 액세스에서 특정 인덱스간에 데이터 집합을 반환하는 방법이 있습니까? 나의 결과는 밥, 시드 빌리는 것입니다 설정,MS 액세스 행 번호, 인덱스를 지정

rank | first_name | age 
    1  Max  23 
    2  Bob  40 
    3  Sid  25 
    4  Billy  18 
    5  Sally  19 

그러나 나는 단지 '순위'2와 4 사이의 레코드를 반환 할 :

그래서 내 데이터 세트는 말할 수? 그러나 순위는 테이블의 일부가 아니며 쿼리가 실행될 때 생성되어야합니다. 레코드가 삭제되면 일관성이 없으며 그 결과를 역으로 원한다면 어째서 자동 생성 된 번호를 사용하지 않는가?

분명히 매우 간단합니다. 제품 카탈로그에서 작업 중이므로 반환 된 데이터 집합을 페이징하는 더 효율적인 방법을 찾고 있기 때문에 데이터의 1 페이지 분량 만 반환하면됩니다. 데이터베이스는 분명히 더 빠를 것이고 3000 레코드의 완전한 세트를 반환하고 그런 다음 그 세트에서 subselect해야합니다!

감사 R.

+0

"이것은 분명히 매우 간단합니다"- 단서 없음 : 누군가가 그 말을들을 때마다 나는 그 문제가 간단하지 않다는 것을 알고 있습니다. 단지 그것이 단순하기를 원합니다. –

+0

제목에서 '색인'이란 단어가 잘못 생각한다고 생각합니다. 예 : '페이징 (paging)'또는 '랭킹 (ranking)'일 수도 있습니다. – onedaywhen

+0

@ David W. Fenton : 나는이 말을 "나는 SQL 결과 집합을 페이징하는 것이 현실 세계에서 공통적 인 시나리오 여야하기 때문에 나는 이것에 대한 Lone Ranger라고 믿을 수 없다"고 말했습니다. ... 그럴 경우, 나는 그것이 맞다고 생각합니다. – onedaywhen

답변

1

원래 제안 :

SELECT * from table where rank BETWEEN 2 and 4; 

는 순위 구조에 존재하지 않는, 주석 후 수정 : 당신,

Select top 100 * from table; 

을 그리고 당신은 이후의 결과를 선택하려는 경우 첫 번째 쿼리에서 마지막 레코드의 ID를 선택할 수 있습니다 (예 : ID 101). WHERE 절을 사용하여 다음 100을 가져옵니다.

Select top 100 * from table where ID > 100; 

그러나 이것들은 당신에게 당신이 찾고있는 것을주지 않을 것입니다.

+0

아니, 당신은 내 질문에 오해했다, 순위는 데이터 집합의 일부가 아닙니다. – flavour404

0

정확하게 이해하면 표에 ionly first_name 및 age 열이 있습니다. 이 경우 Bob, Sid 및 Billy를 단일 쿼리로 반환 할 수있는 방법이 없습니다. 당신이

SELECT * FROM Table 
WHERE FirstName = 'Bob' 
OR FirstName = 'Sid' 
OR FirstName = 'Billy' 

그런 짓을하지만하지 않는 한 나는 이것이 당신이 찾고있는 무엇 아니라고 생각합니다.

이것은 SQL 데이터베이스가 ORDER BY 절을 지정하지 않으면 데이터가 데이터베이스에서 나올 순서를 보증하지 않기 때문입니다. 일반적으로 추가 된 것과 동일한 순서로 나오지만 보증은 없으며 일단 테이블에 많은 행이 있으면 사용자가 입력 한 순서대로 나오지 않을 가능성이 상당히 높습니다

부수적으로, 테이블에 "순위"열 (이 열은 일반적으로 id라고 함)을 추가하고 자동 증가 정수로 지정해야합니다 (Access 설명서 참조). Sev가 언급 한 쿼리. 또한 업데이트 쿼리를 실행할 때 어떤 행이 업데이트되는지 또는 삭제 쿼리를 실행할 때 삭제되는 행이 무엇인지 확인할 수 있도록 기본 키를 갖는 것이 중요합니다. 예를 들어 Max라는 이름의 사람이 2 명 있고 모두 23 명인 경우 다른 사람을 삭제하지 않고 1 행을 삭제하는 방법입니다. 거기에 유일한 자동 증가 고유 열이있는 경우 쿼리에서 고유 ID를 지정하여 하나만 삭제할 수 있습니다. 당신이 "TOP 자동 증가 필드를 추가, 3 개 행을 읽고 싶어, 당신은 당신이, 당신이 사용할 수있는 읽고 싶은 첫 번째 행의 ID를 알고 있다면, 당신의 코멘트를 읽고시

[ADDITION]

"3 행을 읽습니다.

은 데이터를 가정하면 다음과 같은 쿼리 밥, 시드와 빌리를 wuery 수있는이

ID | first_name | age 
    1  Max  23 
    2  Bob  40 
    6  Sid  25 
    8  Billy  18 
    15  Sally  19 

것 같습니다.

SELECT TOP 3 FirstName, Age 
From Table 
WHERE ID >= 2 
ORDER BY ID 
+0

안녕하세요, 감사합니다. 나는 obvioulsy가 문제를 제대로 설명하지 못했습니다. 행이 삭제되면 간격이 남기 때문에 자동 번호 기능을 사용할 수 없습니다. 말하자면 데이터베이스에 쿼리를하고 데이터 집합을 40 행으로 다시 채울 수 있습니다. 따라서 순위는 1에서 40까지 번호가 매겨 지지만 결과는 10 - 15 만 필요합니다.이 방법으로 생각하면, 페이징 기능이없는 웹 사이트에 결과를 반환하면 그 페이지에 10 개의 결과 만 표시되므로 전체 데이터 세트가 필요하지는 않지만 10 개의 레코드 하위 집합 내 페이지를 채 웁니다. – flavour404

+0

ID 열이있을 때 이것이 어떻게 수행되는지 보려면 필자의 추가 정보를 참조하십시오. – Kibbee

1

순위를 어떻게 계산합니까? 어딘가에 다른 데이터 세트의 일부 데이터를 기반으로한다고 가정합니다. 그렇다면 함수를 만들거나 테이블 조인을하거나 다른 테이블의 값에 따라 순위를 계산할 수있는 뭔가를 수행 한 다음 rank() 함수를 기반으로 쿼리를 수행 할 수 있습니다. 예를 들어

: 당신이 어딘가에 일부 데이터를 기준으로 순위를 계산하지 않는 경우

select * 
from table 
where rank() between 2 and 4 

, 정말이 쿼리를 작성하는 방법이 아닌, 당신은뿐만 아니라에서 세 가지 임의의 행을 반환 할 수있다 표.

0

LIMIT 키워드는 MS Access에서 사용할 수 없습니다. 이는 다중 페이지 표현을 위해 MySQL에서 사용되는 키워드입니다. 에서 MyOrder이 (MyOrder DESC에 의해 표 순서와 TOP 55 MyOrder를 선택) WHERE

SELECT TOP 25 MyOrder, 기타 표 FROM : 당신이 결과 테이블에 주문 키를 쓸 수 있다면, 당신은이 같은 것을 사용할 수 있습니다 ORDER BY MyOrder ASCENDING

+0

게시 한 지 24 시간이 지나면 두 가지 문제가 발생합니다. TOP 키를 중첩 및 사용하여 해결할 수있는 레코드 세트의 "중간"슬라이스 설정. 그리고 즉시 불가능한 것처럼 보이는 숫자 시리즈를 생성합니다. 그리고 '순위'가 의미하는 것의 신비가 있습니다. – Smandoli

1

나는 상관 관계 하위 쿼리를 사용하여 비행 중 순위를 계산해야한다고 생각합니다. 내가 이름을 기반으로 순위를 추측하고있어 :

SELECT T1.first_name, T1.age, 
     (
     SELECT COUNT(*) + 1 
      FROM MyTable AS T2 
     WHERE T1.first_name > T2.first_name 
     ) AS rank 
FROM MyTable AS T1; 

나쁜 소식은 Access 데이터 엔진이 제대로 이런 종류의 질의에 최적화되어있다; 내 경험상 공연은 몇 백 줄을 훨씬 넘어서서 눈에 띄게 저하되기 시작합니다.

집의 DB 측 (예 : 삽입 성능이 높은 환경)에서 순위를 유지할 수없는 경우 클라이언트 측에서 페이징을 수행하는 것이 좋습니다. 예를 들어, ADO 클래식 레코드 세트 개체에는 페이징 (PageCount, PageSize, AbsolutePage 등)을 지원하는 속성이 있으며 DAO 레코드 집합 (구형 빈티지)은 지원되지 않습니다.

항상 그렇듯이 자신의 타이밍을 수행해야하지만 10K 행이 있으면 ADO 레코드 집합에 모든 행을 가져 오는 오버 헤드를 취하는 것이 더 빠를 것이라고 생각합니다. 페이지에 대한 행 수를 가져 오는 것보다 상관 관계가있는 하위 쿼리를 수행하는 것보다 작은 페이지 (ADO 레코드 집합을 만드는 것이 좋습니다.