2012-06-13 4 views
4

여기에 문제가 있습니다. 테이블에 두 개의 열이 있는데, 각 그룹에 대해 동일한 순서가 있어야합니다. 이 가정을 계속하기 전에 기존 데이터에 대해 이것이 사실인지 확인하고 싶습니다.정렬 된 두 개의 SQL 쿼리에서 결과를 확인하는 방법은 무엇입니까?

일부 예제 데이터 : 당신이 볼 수 있듯이 내가 있다면

gid c1 c2 
1 1 5 
1 2 7 
2 1 22 
2 2 38 
2 3 40 
3 1 4 
3 2 8 
3 3 2 

는, 결과는 동일 할 것이다
select * from table t where t.gid = 1 order by c1
사용하고
select * from table t where t.gid = 1 order by c2 동일하게 주문하기.
결과도 gid = 2와 일치합니다. 그러나 gid = 3으로 동일한 작업을 수행하면 순서가 더 이상 일치하지 않습니다. 이 경우 c2을 주문하면 c1으로 주문한 것과 다른 결과가 나올 수 있기 때문입니다.

전체 표를 확인하여 각 열의 순서가 gid의 각 값에 대해 동일하게 적용되는지 확인하고 싶습니다. 오라클의 MINUS은 하위 쿼리에서 order by을 허용하지 않으므로 작동하지 않습니다. 때문에 MINUS의 한계 작동하지 않습니다 내 첫 번째 시도는했다 : 그 대답에 도움이된다면 내가 오라클 11g를 사용하고

select gid, c1, c2 from table order by gid, c1, c2 
    minus 
select gid, c1, c2 from table order by gid, c2, c1; 

.

+0

'빼기'는 하나의 세트가 다른 세트에 있는지 여부에만 관심이 있으므로 암시적인 '고유'를 수행하므로 작동하지 않습니다. – Ben

답변

5

row_number을 지정하면 동일한 레코드에서 순서가 달라질 수 있습니다. 그것은 당신의 가정이 잘못 아무것도 반환하면

with ordering as (
    select t.*, 
     row_number() over (partition by gid 
          order by c1) order_c1, 
     row_number() over (partition by gid 
          order by c2) order_c2 
    from t 
) 
select * 
    from ordering 
where order_c1 <> order_c2 
+0

+1하지만't. * '입니다. – Ben

+0

@Nikola,'row_number'는 티켓 일뿐입니다. 완벽하고 빠른 응답. 감사. – Seth

+0

@ 세스 환영합니다 :-) –

0

오라클과 동등한 EXCEPT에 대해 확실하지 않습니다. 그러나 그것은 MS SQL Server에서 잘 작동합니다.

+0

불행히도 오라클의 'EXCEPT'와 'MINUS'는 동일하며 하위 쿼리에서 'order by'를 허용하지 않습니다. – Seth

1

재미있는 문제, 오라클을 가지고 있지만

Select gid,c1,c2,row_number() as rownum from ordering order by gid,c1,c2 
join (select gid,c1,c2,row_number() as otherrownum from ordering order by gid,c2,c1) otherOrdering 
On rownum = otherrownum and 
((ordering.gid <> otherOrdering.gid) Or 
(ordering.c1 <> otherOrdering.c1) or 
(ordering.c2 <> otherOrdering.c2)) 

같은 뭔가하지 않습니다. 또는 <>을 to로 변경하거나 AND로 변경하면 테이블에있는 수와 같은 행 수가 반환됩니다.

어쨌든 생각합니다.

관련 문제