복붙노트

[SQL] 그들이 삽입 된 정확한 순서로 반환 행

SQL

그들이 삽입 된 정확한 순서로 반환 행

나는 간단한 SQL Server의 이드의 열이 테이블에 가입해야합니다. 그들이 삽입 된 정확한 순서에있는 모든 행을 선택하는 방법은 없나요?

내가 ORDER BY 절을 지정하지 않은 경우에도 SELECT *을하려고하면 행은 삽입 된 순서대로 반환하지만, 첫 번째 키 열을 기준으로 정렬되지 않습니다.

나는 그것이 이상한 질문 알지만,이 테이블은 매우 크고, 나는 이상한 행동이 시작하면 정확히 확인해야하고, 불행하게도 나는 테이블에 타임 스탬프 열이 없습니다.

UPDATE # 1

난 내가 ORDER BY 절없이 테이블 SELECT * FROM 때 행이 '자연'순서로 반환되지 않습니다 말하고 이유를 설명하려고합니다.

내 표는 다음과 같이했다 :

id1     id2
---------------
  1       1
  2       2
  3       3
  4       4
  5       5
  5       6

... and so on, with about 90.000+ rows

이제, (아마도 소프트웨어 버그가이 행을 삽입) 이유는 모르겠지만, 내 표는이 같은 450 만 행과 외모를 가지고 :

id1     id2
---------------
1       1
1       35986
1       44775
1       60816
1       62998
1       67514
1       67517
1       67701
1       67837
...
1       75657 (100+ "strange" rows)

2       2
2       35986
2       44775
2       60816
2       62998
2       67514
2       67517
2       67701
2       67837
...
2       75657 (100+ "strange" rows)

미친, 내 테이블 행의 지금 수백만이있다. 이 일어 났을 때 나는 살펴 봐야 (삽입 된 행 때) 내가 그들을 삭제하기 때문에, 이에 속한다 "오른쪽"ID1 열이 있기 때문에 난 그냥 * WHERE ID2 IN (strange_ids) *를 사용하여 삭제할 수 없습니다 내가 정확히 이러한 행이 삭제 삽입했을 때 볼려고, 그래서 이러한 ID2 열은, 나는, 삭제할 수는 없습니다.

나는 테이블 SELECT * FROM 때, 그것은 나를 위의 표와 같이, ID1에 의해 주문 반환하고, 행은 나의 테이블에이 순서에 삽입되지 않았다. 나는이 이상한 행동이 같은 방식으로 발생하는 두 번째 시간이 있기 때문에 내 테이블이 손상되지 않았 있다고 생각하지만, 지금은 1 시간에있는 것처럼 수동으로 삭제할 수 있도록 많은 행이있다. 행이 순서대로 반환되지 않습니다 왜 삽입 된? 이러한 "이상한 행", 그렇지 definetely 어제 삽입되었고, 내가 ORDER BY가없는 SELECT * 할 경우 내 테이블의 끝 부분에 반환해야합니까?

해결법

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

    1.이미 다른 사람이 쓴 것처럼, 당신은 그들이 삽입 된 순서대로 링크 테이블에서 행을 얻을 수 없습니다.

    이미 다른 사람이 쓴 것처럼, 당신은 그들이 삽입 된 순서대로 링크 테이블에서 행을 얻을 수 없습니다.

    하나이 링크 테이블에 합류하는 테이블의 양쪽에있는 행의 내부 순서의 어떤 종류가있는 경우에, 당신은 링크 테이블 행이 생성되었을 때 알아 내려고 시도하는 것을 사용할 수 있습니다. 기본적으로, 그들은 PK가 포함 된 행의 두 전에 생성되지 않았을 수의 생성되었다.

    그러나 다른 한편으로는 그들이 생성 된 시간 후에 찾을 수 없습니다.

    당신이 괜찮은 백업이있는 경우, 당신은 하나 또는 연령 변화의 몇 가지 백업을 복원하려고 다음 해당 백업이 이상한 행동이 포함되어 있는지 확인하기 위해 시도 할 수 있습니다. 그것은 당신에게 낯선가 시작된시기에 대한 적어도 일부 단서를 줄 수 있습니다.

    그러나 결론은 방법들이 삽입 된 순서대로 다음과 같이 테이블의 행을 얻기 위해 지금이 단지 선택 사용한다는 것입니다.

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

    2.특정 순서로 행을 검색하지 않습니다에 의해 어떤 순서 선택 쿼리. 당신은 순서를 얻을하여 주문을해야합니다.

    특정 순서로 행을 검색하지 않습니다에 의해 어떤 순서 선택 쿼리. 당신은 순서를 얻을하여 주문을해야합니다.

    SQL Server는 삽입 순서에 따라 검색에 대한 기본 방법이 없습니다. 당신이 행의 정보를 가지고 있다면 당신은 그것을 할 수 있습니다. 가장 좋은 방법은 기본 키 ID 열 :

    TableId int identity(1, 1) not null primary key
    

    각 행이 삽입 등의 열이 증가한다.

    또한 CreatedAt 열을 가질 수 있습니다 :

    CreatedAt datetime default getdate()
    

    그러나이 동시 삽입에 대한 중복을 가질 수있다.

    핵심은, 그래도 절 리턴으로 어떤 순서로 행 정렬되지 않은 집합을 선택한다는 것입니다.

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

    3.SELECT *는 '자연'순서로 반환하지 않습니다 그리고 당신은 타임 스탬프 또는 자동 증가 ID로 삽입하지 않았다면 나는 당신이 침몰하고 생각합니다. 해당하여 IDENTITY 필드 순서를 가지고 있다면. 하지만이 가지고있는 문제는, 당신은 어떻게 순서대로 반환하지 않습니다 SELECT *가 삽입 된 것을 알 수 있습니까?

    SELECT *는 '자연'순서로 반환하지 않습니다 그리고 당신은 타임 스탬프 또는 자동 증가 ID로 삽입하지 않았다면 나는 당신이 침몰하고 생각합니다. 해당하여 IDENTITY 필드 순서를 가지고 있다면. 하지만이 가지고있는 문제는, 당신은 어떻게 순서대로 반환하지 않습니다 SELECT *가 삽입 된 것을 알 수 있습니까?

    최신 정보: 당신이 원하는대로 레코드를 반환 할 수있는 아무런 방법이없는 것처럼 당신의 갱신을 바탕으로, 보이는, 당신이 ID1에 클러스터 된 인덱스를 가지고 추측에는 요?

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

    4.

    Select *, %%physloc%% as pl from table
    order by pl desc
    
  5. from https://stackoverflow.com/questions/17345731/return-rows-in-the-exact-order-they-were-inserted by cc-by-sa and MIT license