2011-12-07 18 views
2

ビューのすべての行に対して一意の識別子を作成しようとしています。私が見たビューはたくさんのテーブルを結合しているので、テーブルのプライマリキーが1つもありません。Oracle JoinビューでROWIDを使用する方法

Google検索を実行すると、これはROWIDを使用してこれを達成できるようですか?しかし、私はどのようにビューのROWIDを参照するか分からない。以下は、私がROWIDを構想する方法の例ですが、ROWIDの特定のテーブルを指定していないので、明らかに 'あいまいな列'のエラーで失敗します。

例:


    with v_someTable (select...), 
     v_anotherTable as (select blah, id from v_someTable where...), 
     v_yetAnotherTable as (select foo, id from v_someTable where...) 
    select distinct rowid, rt.key, v1.blah, v2.foo 
    from realTable rt 
     left join v_anotherTable v1 on v1.id=rt.id 
     left join v_yetAnotherTable v2 on v2.id=rt.id 

私は、クエリではなく、ストアドプロシージャでこれを行うにしようとしています。どんな助けもありがとう!

ありがとうございます!

答えて

5

私の理解では、rowidは、結果セット内の行ではなく物理テーブル内の行を参照しています(実際にはビューと同じです)。

各行に固有の識別子を取得するには、結合するテーブルの主キーを何らかの方法で結合する必要があります。

+0

Gotcha、私は、私が望むものを達成するために多くの主キーを連結しました。ありがとう! – user973479

3

あなたはすべてのテーブルのプライマリ主キーを持っていない場合は、個々のテーブルからROWIDを選択し、それらを連結できます。

SELECT rt.rowid||v1.rowid||v2.rowid as uniqueid 
FROM ...... 
+0

私は他のテーブルのプライマリキーを持っていますが、これは知っておくと良いです。ありがとう! – user973479

1

は、ROWID疑似列を使用しないでください、それは(ストレージdependendです便利なENABLE ROW MOVEMENTが使用されたときに変更される可能性があります)。ビューでレコードを効率的に検索(結合)することもできません。

この場合、実際のP​​Kをレコードに使用する方がよい(インデックスルックアップが機能するためには)。そして、私はそれらに参加しませんが、複数の列を使用するだけです。インデックスをサポートすることで、それらを再選択することができます。

0

この質問は今すぐに回答されますが、主キーをconcatinatingするときは注意してください。キーは23 and 45だったら あなたはkey1 = 23 and key2 = 45を持っており、それが2345にconcatinate例えば、それは明らかではないか、彼らがいた場合は、2 and 345

デリミタ(23,45 -> 23_45)を使用してください(すべてのキーが数字ではありません)。または可能な限り最大の長さのキーを入力してください(23,45 -> 00230045 (for key1 and key2 NUMBER(4,0)))

また、Oracles機能(すべてのDBがこれを処理できるわけではありません)に注意してください。複数の列にまたがってプライマリキーと外部キーを定義することができます。

関連する問題