2016-08-31 2 views
0

私はテーブルt1とテーブルt2を持っています。テーブルt1のように、プライマリ制約は無効状態になります。一次制約は列C1,C2にあり、テーブルt2には制約がありません。ROWIDを比較するには

任意の例外がある場合、私はテーブルt1に主要な制限PK_testを有効にしようとすると(レコードが制約に違反する)は、以下のように列c1,c2を持つことになりますテーブルt2 .Table t1に保存されます。

C1 C2 ROWID 
1  2 ABCD 
1  2 ABCE 
1  2 ABCF 
7  8 ABCI 

とテーブルt2PK

に違反するだけで、これらの行は、だから私は列C1,C2用テーブルt2でのみmin(ROWID)を維持したいので、データ

ROWID 
ABCD 
ABCE 
ABCF 

でカラムROWIDを持つことになります。 だから私は、クエリ

delete * 
from t2 
where ROWID not in(select min(ROWID) 
        from t1 
        where ROWID in (select ROWID 
             from t2) 
        group by C1,C2); 

を書かれている。しかし上記のクエリも正しく1 ROWS(ABCD)を返すselect min(rowed)..クエリをNULLを書いています。

ここで間違っている箇所を見つけるのを手伝ってください。ここで

+0

'ROWID'は実際にテーブルの列ですか、[ROWID疑似列](https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm)を参照していますか?私はここで少し混乱している。 –

+0

私はROWID擬似列 – teepu

+0

OKを参照しています。テーブル 't2'は実際の列' ROWID'を持っていますか? 't2.rowid'の名前を変更することをお勧めします。これがOracleの内部ROWIDを妨げるかどうかはわかりません。 –

答えて

0

私は

delete t2 
where t2."ROWID" > (select min(a."ROWID") 
         from t1 join t1 a on t1.c1 = a.c1 and t1.c2 = a.c2 
        where t1."ROWID" = t2."ROWID"); 
+0

内部クエリ 'select min(a.rowed)..'が複数の行を返す場合はどうなりますか? – teepu

+0

@teepu私はあなたのケースについてはっきりしていないので、複数のテストを返すことはできません。テスト/ devシステムで試してみてください。 – vercelli

+0

私はまだそれがNULLを返すことを試みた。 – teepu

1

私はこれを書くのと同じC1とC2を持つ任意のT1の分(ROWID)よりも大きいことt2.ROWIDを削除しようとしている単に:

delete t2 
    where t2."RowId" not in (select min(t1."RowId") 
          from t1 
          group by c1, c2 
          ); 
+0

@teepu Gordonは正しいです – vercelli