5

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

一些示例数据:

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 执行相同操作,则顺序将不再匹配。因为在这种情况下, ordering byc2与 ordering by 的结果不同c1

我想检查整个表,以确保按这些列中的任何一个进行排序对于gid. OracleMINUS将不起作用,因为它不允许 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。

4

3 回答 3

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
于 2012-06-13T21:11:39.117 回答
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))

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

反正我觉得。

于 2012-06-13T21:21:32.020 回答
0

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

于 2012-06-13T21:08:26.797 回答