问题在于:我在表中有两列,对于每个分组,应该具有相同的顺序。在我做出这个假设之前,我想检查现有数据是否正确。
一些示例数据:
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。
答案 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上运行得很好。