如何检查两个有序SQL查询的结果是否匹配?

时间:2012-06-13 21:02:45

标签: sql oracle

问题在于:我在表中有两列,对于每个分组,应该具有相同的顺序。在我做出这个假设之前,我想检查现有数据是否正确。

一些示例数据:

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
结果将是相同的,并且与WB相同 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。

3 个答案:

答案 0 :(得分:6)

通过分配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

答案 1 :(得分:1)

有趣的问题,没有Oracle但是 像

这样的东西
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))

如果它返回任何您的假设是不正确的。 或者您可以更改&lt;&gt; to =和Or to AND,它应该返回与表中相同的行数。

无论如何,我想。

答案 2 :(得分:0)

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