복붙노트

[SQL] Microsoft Access를 사용하여 쿼리 결과에서 행 번호

SQL

Microsoft Access를 사용하여 쿼리 결과에서 행 번호

난 항상 테이블에 행 번호를 얻기 위해 SQL 서버에서이 쿼리를 사용합니다 :

SELECT *
FROM   (SELECT *,
               Row_number()
                 OVER(
                   ORDER BY [myidentitycolumn]) RowID
        FROM   mytable) sub
WHERE  rowid = 15  

지금은 액세스 2010 년에 일하고이 작동하지 않는 것 같습니다. Access에서이 쿼리에 대한 교체가 있습니까?

해결법

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

    1.MS-액세스 ROW_NUMBER를 지원하지 않습니다 (). 사용 TOP 1 :

    MS-액세스 ROW_NUMBER를 지원하지 않습니다 (). 사용 TOP 1 :

    SELECT TOP 1 *
    FROM [MyTable]
    ORDER BY [MyIdentityCOlumn]
    

    당신이 15 행을해야 할 경우 - MS-액세스 내장, 간단한이 없습니다, 방법은이 작업을 수행합니다. 당신이 얻을 역 중첩 순서를 사용하여 ROWNUMBER을 시뮬레이션 할 수 있습니다 :

    SELECT TOP 1 *
    FROM (
      SELECT TOP 15 *
      FROM [MyTable]
      ORDER BY [MyIdentityColumn] ) t
    ORDER BY [MyIdentityColumn] DESC
    
  2. ==============================

    2.쿼리에서 행 번호를 지정하는 또 다른 방법은 DCOUNT 함수를 사용하는 것입니다.

    쿼리에서 행 번호를 지정하는 또 다른 방법은 DCOUNT 함수를 사용하는 것입니다.

    SELECT *, DCount("[ID]","[mytable]","[ID]<=" & [ID]) AS row_id
    FROM [mytable]
    WHERE row_id=15
    
  3. ==============================

    3.나는 팀 당 지점의 최고의 X 결과를 필요로했다.

    나는 팀 당 지점의 최고의 X 결과를 필요로했다.

    하지 않습니다 랭킹 동일한 점으로 결과가이 문제를 해결합니다. 나는 recordnumber이 필요합니다 그래서

    나는 ID 변화에 재설정하는 recordnumber를 만들 Access에서 VBA 기능을했다.

    당신은 어디 recordnumber <이 쿼리를 조회해야 = X 팀 당 포인트를 획득 할 수 있습니다.

    NB 액세스 레코드 번호를 변경

    그건 내가 그런 일 것이라고 생각 것이 아니다.

    recordnumbers 및 키 또는 테이블의 추가 필드를 임시 테이블을 사용하고 저장하여이 문제를 해결했다.

    SELECT ID, Points, RecordNumberOffId([ID}) AS Recordnumber
    FROM Team ORDER BY ID ASC, Points DESC;
    

    그것은 호출 사이에 기억해야 할 3 개 모듈 수준 변수를 사용

    Dim PreviousID As Long
    Dim PreviousRecordNumber As Long
    Dim TimeLastID As Date
    
    Public Function RecordNumberOffID(ID As Long) As Long 
    'ID is sortgroup identity
    'Reset if last call longer dan nn seconds in the past
    If Time() - TimeLastID > 0.0003 Then '0,000277778 = 1 second
        PreviousID = 0
        PreviousRecordNumber = 0
    End If
    If ID <> PreviousID Then
        PreviousRecordNumber = 0
        PreviousID = ID
    End If
    PreviousRecordNumber = PreviousRecordNumber + 1
    RecordNumberOffID = PreviousRecordNumber
    TimeLastID = Time()
    End Function
    
  4. ==============================

    4.이 오래된 질문이지만, 이것은 나를 위해 일했지만, 나는 그것의 효율성을 테스트 한 적이 ...

    이 오래된 질문이지만, 이것은 나를 위해 일했지만, 나는 그것의 효율성을 테스트 한 적이 ...

    SELECT 
        (SELECT COUNT(t1.SourceID) 
         FROM [SourceTable] t1 
         WHERE t1.SourceID<t2.SourceID) AS RowID, 
        t2.field2, 
        t2.field3, 
        t2.field4, 
        t2.field5
    FROM 
        SourceTable AS t2
    ORDER BY 
        t2.SourceID;
    

    이 방법의 장점 :

    마지막 생각들

    이 실질적으로 모든 데이터 유형에서 작동하지만, 나는 어떤을 위해, 그것은 다른 문제를 만들 수 있음을 강조해야합니다. 예를 들어, 문자열, 고려 :

    ID     Description    ROWID
    aaa    Aardvark           1
    bbb    Bear               2
    ccc    Canary             3
    

    내가 삽입한다면 : 멧돼지 BBA, 다음 카나리아 ROWID가 변경됩니다 ...

    ID     Description    ROWID
    aaa    Aardvark           1
    bbb    Bear               2
    bba    Boar               3
    ccc    Canary             4
    
  5. ==============================

    5.나는 () 문자열 필드 및 NOT ID, 백작 (*) 및 DCOUNT 알파벳 순으로 정렬하고 있기 때문에 접근 방법은 나를 위해 작동하지 않았다. 내 솔루션은 행 번호를 반환하는 함수를 작성했다 :

    나는 () 문자열 필드 및 NOT ID, 백작 (*) 및 DCOUNT 알파벳 순으로 정렬하고 있기 때문에 접근 방법은 나를 위해 작동하지 않았다. 내 솔루션은 행 번호를 반환하는 함수를 작성했다 :

    Option Compare Database
    Option Explicit
    Private Rst As Recordset
    
    Public Function GetRowNum(ID As Long) As Long
      If Rst Is Nothing Then
        Set Rst = CurrentDb.OpenRecordset("SELECT ID FROM FileList ORDER BY RealName")
      End If
      Rst.FindFirst "ID=" & ID
      GetRowNum = Rst.AbsolutePosition + 1
    ' Release the Rst 1 sec after it's last use
    '------------------------------------------
      SetTimer Application.hWndAccessApp, 1, 1000, AddressOf ReleaseRst  
    End Function
    
    
    Private Sub ReleaseRst(ByVal hWnd As LongPtr, ByVal uMsg As Long, ByVal nIDEEvent As Long, ByVal dwTime As Long)
      KillTimer Application.hWndAccessApp, 1 
      Set Rst = Nothing
    End Sub
    
  6. ==============================

    6.위의 솔루션에 대한 감사합니다! DCOUNT 너무 나를 위해 속임수를 썼는지!

    위의 솔루션에 대한 감사합니다! DCOUNT 너무 나를 위해 속임수를 썼는지!

    내가 날짜 컬럼의 조합과의 정렬 부분 (뿐만 아니라 몇 가지 추가 조건)에 대한 고유 식별자를 사용했다, 그래서 여기에 내가하고 결국 무엇을 :  1) 나는 DateColumnA가 null 인 경우 DateColumnB는 다음 사용 DateColumnC null의 경우 확인 후, 확인했다; 여러 레코드가 동일한 날짜 값이있는 경우 다음, 그들은 모두 같은 ID로 끝!  2) 그래서, 나는 테이블의 정수 고유 ID를 사용하고, "분"으로 시간을 추가 할 것입니다 생각. 이것은 항상 다른 결과를 제공 할 것입니다  3) 마지막으로, 0에서 시작하는 카운트 결과 위의 논리는 ... 그래서 그냥 하나를 추가!

    SELECT 
     1+DCount("[RequestID]","[Request]","Archived=0 and ProjectPhase <> 2 and iif(isnull(DateColumnA)=true,iif(isnull(DateColumnB)=true,DateColumnC,DateColumnB),DateColumnA)+(RequestID/3600) < #" & if(isnull(DateColumnA)=true,iif(isnull(DateColumnB)=true,DateColumnC,DateColumnB),DateColumnA) + (RequestID/3600) & "#") AS RowID, 
    FROM 
     Request
    ORDER BY 1
    

    나는 이것이 당신을 도움이되기를 바랍니다!

  7. ==============================

    7.나는 늦을 수 있습니다. 간단하게 유형의 일련 번호와 테이블에 새로운 필드 ID를 추가합니다. 이 고유 ID를 생성합니다 너무 Access에서 활용할 수

    나는 늦을 수 있습니다. 간단하게 유형의 일련 번호와 테이블에 새로운 필드 ID를 추가합니다. 이 고유 ID를 생성합니다 너무 Access에서 활용할 수

  8. from https://stackoverflow.com/questions/17279320/row-numbers-in-query-result-using-microsoft-access by cc-by-sa and MIT license