2012-06-13 48 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的值都有相同的结果。 Oracle的MINUS将不起作用,因为它不允许在子查询中使用order by。我的第一次尝试,它不因MINUS局限性的工作,就是:

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

我使用Oracle 11g如果有了答案帮助。

+0

'minus'不起作用,因为它只是隐式的'distinct',因为你只关心一个集合是否存在于另一个集合中。 – 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,但它是'*。*'。 – Ben

+0

@Nikola,'row_number'就是票。完美和如此快速的回应。谢谢。 – Seth

+0

@Seth不客气:-) –

0

我不确定Oracle上的EXCEPT等价物。但是,这在MS SQL Server上运行得很好。

+0

不幸的是,Oracle的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)) 

如果返回任何你的假设是不正确。 或者您可以将<>更改为=并将其设置为AND,它应该返回与表中相同数量的行。不管怎么说,

相关问题