2011-08-06 4 views
0

내가 처음 두 행을 얻을 것 한 번에 두 개의 레코드를 반환하여 페이징 호출을 할 때 나는이SQL 정렬/페이징 질문 질문

 
ID Col1 Col2 
1  a  11 
2  b  22 
3  c  33 
4  d  44 
5  e  55 

같은 피벗 정렬 된 데이터 집합을 갖고 있다고 할 수 있습니다.

내가 같은 데이터를 반환하지만 내 데이터 세트가

 
ID Col  Val 
1  Col1 a 
2  Col1 b 
3  Col1 c 
4  Col1 d 
5  Col1 e 
1  Col2 11 
2  Col2 22 
3  Col2 33 
4  Col2 44 
5  Col2 55 

내가 첫 번째 예에서와 동일한 데이터를 반환하여 SQL 명령문을 작성하고자처럼 보이는 있도록 데이터를 피벗하지하고 싶은 말은하자 데이터를 먼저 피벗하지 않아도됩니다.

일부 추가 challanges는

1) 두

2) 고작 또한 모든 컬럼에 필터를 지원해야하지 n 열의가있을 수 있습니다. 이 파트는 이미 아래에서 볼 수 있습니다.

 
Filter on pivoted data 
WHERE Col1 in ('a', 'b', 'c') 
AND Col2 in ('11', '22') 

Filter on unpivoted data 
WHERE (Col = 'Col1' and Val in ('a', 'b', 'c')) or Col != 'Col1') 
AND (Col = 'Col2' and Val in ('11', '22')) or Col != 'Col2') 

Both filters return the same results. 

필터 파트는 이미 정렬 및 페이징에 집중되어 있습니다.

+0

내가보기에 하나의 옵션은 ROW_NUMBER를 사용하고 그런 다음 정렬하고 페이지하는 것입니다. –

답변

1

SQL은 표준으로 이러한 조작을 지원하지 않습니다. 데이터를 재 형식화하기 위해 임의로 많은 컬럼을 처리하려면 Perl의 DBI 인터페이스와 같은 것을 사용하십시오.이 인터페이스는 테이블의 컬럼 이름을 알려줍니다. 거기에서 테이블 생성을 생성 할 수 있습니다.

는 삽입 형태를 취할 것입니다 두 번째 테이블을 만들려면 :
INSERT INTO newtable (id, col, val) 
SELECT id, 'Col1', Col1 from oldtable 
UNION 
SELECT id, 'Col2', Col2 from oldtable; 

그냥 포함 할 각 컬럼에 대한 추가 UNION SELECT...을 만들 수 있습니다.

필터 쿼리는 불필요하게 복잡하게 만듭니다. 귀하의 질의 :

SELECT * FROM newtable 
WHERE (Col = 'Col1' and Val in ('a', 'b', 'c')) or Col != 'Col1') 
AND (Col = 'Col2' and Val in ('11', '22')) or Col != 'Col2') 

은 다른 사람을 방해하지 않는

SELECT * from newtable 
WHERE (Col = 'Col1' and Val in ('a','b','c')) 
    OR (Col = 'Col2' and Val in ('11','22') ) 

각각 별도의 OR D 절과 같이 다시 쓸 수 있습니다.

사람들이 SQL에서 그러한 travesties를 왜 시도하는지 이해할 수 없습니다. 합리적인 스키마를 키/값 저장소와 비슷한 것으로 만들기 위해 노력하고있는 것처럼 보입니다. 현재 요즘 어린이들과 분노하고있는 것은 사실이지만 좋은 데이터 모델링으로 SQL의 모든 기능을 사용하는 방법을 배우려고 노력해야합니다.