복붙노트

[SQL] 어떻게 MS 액세스를 위해 SQL의 페이지 매김을 구현합니까?

SQL

어떻게 MS 액세스를 위해 SQL의 페이지 매김을 구현합니까?

나는 매우 느리게 불구하고 아주 잘 작동 OdbcConnection 클래스를 통해 ASP.NET을 사용하여 Microsoft 액세스 2002 데이터베이스 (MDB)에 액세스하고 있습니다.

내 질문은 내가으로 TOP 절을 구현할 수 있습니다 아는 한,이 데이터베이스에 쿼리를 SQL에 페이지 매김을 구현하는 방법에 관한 것입니다 :

SELECT TOP 15 *
FROM table

하지만 SQL 서버가 ROWNUMBER를 사용하여 수행 할 수 있습니다으로 오프셋이를 제한 할 수있는 방법을 찾을 수 없습니다입니다. 내 최고의 시도했다 :

SELECT ClientCode,
    (SELECT COUNT(c2.ClientCode)
        FROM tblClient AS c2
        WHERE c2.ClientCode <= c1.ClientCode)
    AS rownumber
FROM tblClient AS c1
WHERE rownumber BETWEEN 0 AND 15

있는 실패

이 오류를 해결할 수는 없지만, 나는 그것이 ROWNUMBER을 결정하는 하위 쿼리를 함께 할 수있는 뭔가가 있으리라 믿고있어?

어떤 도움이 함께 감상 할 수있다; 구글 내 검색이 도움이되지 않는 결과를 산출했다 :(

해결법

  1. ==============================

    1.당신은 MS Access에서 페이징을 적용 할 경우에 사용

    당신은 MS Access에서 페이징을 적용 할 경우에 사용

    SELECT *
    FROM (
        SELECT Top 5 sub.ClientCode
        FROM (
            SELECT TOP 15 tblClient.ClientCode
            FROM tblClient
            ORDER BY tblClient.ClientCode
        ) sub
       ORDER BY sub.ClientCode DESC
    ) subOrdered
    ORDER BY subOrdered.ClientCode
    

    StartPos + 페이지 크기는 어디 (15), 그리고 5는 페이지 크기이다.

    주석을 편집 :

    쿼리, 즉 ROWNUMBER 동일한 수준의 열 이름 할당을 참조하려고하기 때문에 당신이 받고있는 오류입니다. 당신은 당신의 쿼리를 변경한다면 :

    SELECT *
    FROM (
        SELECT ClientCode,
               (SELECT COUNT(c2.ClientCode)
                FROM tblClient AS c2
                WHERE c2.ClientCode <= c1.ClientCode) AS rownumber                
        FROM tblClient AS c1
    )
    WHERE rownumber BETWEEN 0 AND 15
    

    그것은 당신에게 오류를 제공하지해야하지만, 나는이 원하는 페이징 결과라고 생각 해달라고.

  2. ==============================

    2.원래 대답을 astander의 답변을 볼 수 있지만, 여기에 몇 가지 ODBC 파서 규칙 (처음 15 개 레코드 (30)을 건너 뛰는 후) 고려 내 최종 구현입니다 :

    원래 대답을 astander의 답변을 볼 수 있지만, 여기에 몇 가지 ODBC 파서 규칙 (처음 15 개 레코드 (30)을 건너 뛰는 후) 고려 내 최종 구현입니다 :

    SELECT *
    FROM (
      SELECT Top 15 -- = PageSize
      *
      FROM
      (
       SELECT TOP 45 -- = StartPos + PageSize
       *
       FROM tblClient
       ORDER BY Client
      ) AS sub1
      ORDER BY sub1.Client DESC
     ) AS clients
    ORDER BY Client
    

    여기의 차이는 클라이언트 이름으로 분류 할 때 나는 일에 페이지 매김을해야하고, 내가 모든 열 필요 (물론, 실제로는 단지 일부를,하지만 난 종류의 그 가장 바깥 쪽 쿼리 아웃)이다.

  3. ==============================

    3.나는 Access에서 페이지 매김을 구현하기 위해 SQL 코드를 사용

    나는 Access에서 페이지 매김을 구현하기 위해 SQL 코드를 사용

    선택 TOP Row_Per_Page *에서 TOP (TotRows 선택 - ((PAGE_NUMBER - 1) * Row_Per_Page) sampletable는 주문의 ColumnName DESC에서 ] 주문의 ColumnName ASC

    나는 스크린 샷과 기사를 게재했습니다 내 블로그에

  4. ==============================

    4.이를 위해 OleDbDataAdapter 데이터 테이블 및 클래스를 이용하여 페이징의 단순한 방법이다. 나는 단순함에 대해 다른 SQL 명령을 사용하고 있습니다.

    이를 위해 OleDbDataAdapter 데이터 테이블 및 클래스를 이용하여 페이징의 단순한 방법이다. 나는 단순함에 대해 다른 SQL 명령을 사용하고 있습니다.

            Dim sSQL As String = "select Name, Id from Customer order by Id"
            Dim pageNumber As Integer = 1
            Dim nTop As Integer = 20
            Dim nSkip As Integer = 0
            Dim bContinue As Boolean = True
            Dim dtData as new Datatable
            Do While bContinue
    
                dtData = GetData(sSQL, nTop, nSkip, ConnectionString)
    
                nSkip = pageNumber * nTop
                pageNumber = pageNumber + 1
    
                bContinue = dtData.Rows.Count > 0
                If bContinue Then
                    For Each dr As DataRow In dtData.Rows
                        'do your work here
                    Next
                End If
            Loop
    

    여기에 GetData의 기능이다.

        Private Function GetData(ByVal sql As String, ByVal RecordsToFetch As Integer, ByVal StartFrom As Integer, ByVal BackEndTableConnection As String) As DataTable
        Dim dtResult As New DataTable
        Try
            Using conn As New OleDb.OleDbConnection(BackEndTableConnection)
                conn.Open()
                Using cmd As New OleDb.OleDbCommand
                    cmd.Connection = conn
                    cmd.CommandText = sql
                    Using da As New OleDb.OleDbDataAdapter(cmd)
                        If RecordsToFetch > 0 Then
                            da.Fill(StartFrom, RecordsToFetch, dtResult)
                        Else
                            da.Fill(dtResult)
                        End If
                    End Using
                End Using
            End Using
        Catch ex As Exception
        End Try
        Return dtResult
    End Function
    

    위의 코드는 테이블 고객에서 루프가 파일의 끝 부분까지 조작 할 때마다 10 개 행을 반환합니다.

  5. ==============================

    5.사용 제한 또는 GET 매김 한 가지 쉬운 방법은 액세스에서 작업하는 것은 동일한 구문 많은 데시벨에 대한 지원 매김 ADODB 라이브러리를 사용하는 것입니다. http://phplens.com/lens/adodb/docs-adodb.htm#ex8 그것 쉽게 수정할 / 재정의 호출기 클래스는 배열 형식의 행 필요한 수를 가져올 수 있습니다.

    사용 제한 또는 GET 매김 한 가지 쉬운 방법은 액세스에서 작업하는 것은 동일한 구문 많은 데시벨에 대한 지원 매김 ADODB 라이브러리를 사용하는 것입니다. http://phplens.com/lens/adodb/docs-adodb.htm#ex8 그것 쉽게 수정할 / 재정의 호출기 클래스는 배열 형식의 행 필요한 수를 가져올 수 있습니다.

  6. ==============================

    6.

    SELECT  *
    FROM BS_FOTOS AS TBL1
    WHERE ((((select COUNT(ID) AS DD FROM BS_FOTOS AS TBL2 WHERE TBL2.ID<=TBL1.ID)) BETWEEN  10 AND 15 ));
    

    그 결과 10 ~ 15 만 기록.

  7. from https://stackoverflow.com/questions/1900635/how-do-i-implement-pagination-in-sql-for-ms-access by cc-by-sa and MIT license