5

問題は次のとおりです。テーブルに2つの列があり、グループごとに同じ順序にする必要があります。今後その仮定をする前に、これが既存のデータに当てはまることを確認したいと思います。

いくつかのサンプルデータ:

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許可されていないため、 Oracleは機能しません。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;

それが答えに役立つなら、私はオラクル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))

それが何かを返す場合、あなたの仮定は正しくありません。または、<>を=およびまたはANDに変更すると、テーブルにあるのと同じ数の行が返されます。

とにかく思います。

于 2012-06-13T21:21:32.020 に答える
0

Oracleで同等のEXCEPTについてはよくわかりません。しかし、それはMSSQLServerでは問題なく機能します。

于 2012-06-13T21:08:26.797 に答える