2011-02-17 3 views
-1

SQL 테이블 행을 재정렬 할 수 있습니까?날짜순으로 SQL 행 재정렬/업데이트

나는 약 8000 개의 행을 가지고 있으며 ID가 ID와 비교하여 순서가 엉망이므로 다소 혼란 스럽다. ID를 삭제하고 다시 추가하여 순서를 재설정 할 수 있음을 알고 있지만 (INT 자동 imp) 날짜순. 나는 그것의 업데이 트를 추측하고있어

...

나는 스크립트에서 '날짜 BY ORDER'나는 간단하게 할 수 알고 있지만 나는 'ID에 의해 ORDER'아닌 것과 좋은 깨끗한 DB를 가지고 ... 쿼리를 높고 낮은 답변을 검색했지만 아직 찾지 못했습니다.

+1

이진 색인을 열 날짜에 사용하는 경우 ID 또는 날짜순으로 주문할 수 있습니다. 단, 다시 주문하지 않아도됩니다. – SergeS

+1

일반적으로 SQL 데이터베이스 시스템에서는 "주문"하지 않고 다시 주문하지 않습니다. - 테이블을 물리적으로. 주문이 필요하다면'SELECT' 쿼리에'ORDER BY'를 지정하십시오 - 그게 전부입니다. –

+0

그래, 내 SELECT 쿼리에서 간단히 'ORDER BY 날짜'를 알 수 있지만 조직 된 DB를 가지고 있고 'ORDER BY id'를 할 수있다. 내 첫 게시물에서 그렇게 말한 것이다.) – Dizzi

답변

1

나는 당신의 목표에 동의하지만, 난 당신이되도록 프로 시저를 작성 수 있다고 생각 :

  • 가에서 모든 행을 제거합니다 (사용 커서) 레코드에서 그들을 저장

    • 날짜별로 정렬 된 모든 행을 선택 테이블
    • 정말 목표에 동의하지 않는 자동 증분 ID
  • 0

    를 이용, 주기적으로 각 행을 추가하지만.

    SQL Server 2005 이상에서는 이것을 사용할 수 있습니다. 한 번에이 작업을 수행하면 다른 테이블의 모든 외래 키 후크를 그대로 유지하면서 테이블 제약 조건, 기본값 등을 그대로 유지합니다.

    create table badlyordered(id int identity, date datetime, otherdata varchar(100)) 
    insert badlyordered(date) select getdate()+4 
    insert badlyordered(date) select getdate()+2 
    insert badlyordered(date) select getdate()+3 
    insert badlyordered(date) select getdate() 
    insert badlyordered(date) select getdate()+10 
    insert badlyordered(date) select getdate()-10 
    update badlyordered set otherdata = date 
    
    select * from badlyordered order by id 
    
    id   date     otherdata 
    ----------- ----------------------- --------------------- 
    7   2011-02-21 18:51:55.087 Feb 21 2011 6:51PM 
    8   2011-02-19 18:51:55.087 Feb 19 2011 6:51PM 
    9   2011-02-20 18:51:55.087 Feb 20 2011 6:51PM 
    10   2011-02-17 18:51:55.087 Feb 17 2011 6:51PM 
    11   2011-02-27 18:51:55.087 Feb 27 2011 6:51PM 
    12   2011-02-07 18:51:55.087 Feb 7 2011 6:51PM 
    
    ;with tmp as (
    select *, 
    table_seq = row_number() over (order by id), 
    nice_seq = row_number() over (order by date, id) 
    from badlyordered 
    ) 
    update t1 
    set date = t2.date 
        ,otherdata = t2.otherdata 
        -- and any other columns in the table 
    from tmp t1 
    inner join tmp t2 on t1.table_seq=t2.nice_seq 
    
    select * from badlyordered order by id 
    
    id   date     otherdata 
    ----------- ----------------------- --------------------- 
    7   2011-02-07 18:51:55.087 Feb 7 2011 6:51PM 
    8   2011-02-17 18:51:55.087 Feb 17 2011 6:51PM 
    9   2011-02-19 18:51:55.087 Feb 19 2011 6:51PM 
    10   2011-02-20 18:51:55.087 Feb 20 2011 6:51PM 
    11   2011-02-21 18:51:55.087 Feb 21 2011 6:51PM 
    12   2011-02-27 18:51:55.087 Feb 27 2011 6:51PM 
    

    그러나 저는 MySQL을 사용하고 있다는 것을 알고 있습니다. 변수를 사용하여 MySQL에서 행 번호 매기기를 두 번 수행 한 다음 행 번호를 사용하여 업데이트를 수행 할 수도 있습니다.

    이렇게하면 SQL Server에서 CTE와 동일한 데이터가 생성됩니다.

    select ..(rownumber variable by date).. from 
    (
    select ..(rownumber variable by id).. from tbl order by id 
    ) n 
    

    당신은 필요 2 (!) 그

    select n.id, o.id 
    from 
    (
    
    select ..(rownumber variable by date).. from 
    (
    select ..(rownumber variable by id).. from tbl order by id 
    ) n 
    
    inner join 
    
    select ..(rownumber variable by date).. from 
    (
    select ..(rownumber variable by id).. from tbl order by id 
    ) n 
    
    on .... 
    ) o 
    

    의 대상으로 원본 업데이트 ID의지도를 생성한다. 마지막으로 업데이트를 수행하기 위해 테이블을이 ID 세트에 조인하려면 UPDATE FROM JOIN MySQL 기술을 사용해야합니다.

    0

    어떤 ID가 사용됩니까? ID를 변경하는 데 문제가없는 것 같지만 다른 곳에서 참조 된 경우 문제가됩니다. 다른 곳에서 참조되지 않은 경우 열이 사라질 수 있으므로 데이터베이스 디자인을 다시 생각해 볼 수 있습니다.

    ID 열이있는 새 테이블을 만들고 ID 열없이 행 데이터를 삽입하고 이전 테이블을 삭제 한 다음 이전 테이블의 이름을 사용하여 새 테이블의 이름을 바꿀 수 있습니까?