2011-12-07 7 views
2

뷰의 모든 행에 대해 고유 한 식별자를 만들려고합니다. 내가 가지고있는 뷰가 많은 테이블을 결합하므로 아무 테이블의 기본 키도 내가 행을 식별하는 데 도움이되지 않습니다.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이 사용될 때 변경 될 수 있음). 뷰에서 레코드를 효율적으로 조회 (조인)하는데도 사용할 수 없습니다.

이 경우 실제 색인을 사용하는 것이 좋습니다 (색인 조회가 작동하기 위해). 그리고 나는 그것들에 참여하지 않을 것이지만, 단지 다중 컬럼을 사용합니다 - 인덱스 지원을 사용하여 다시 선택할 수 있습니다.

0

이 질문에 대한 답변은 당분간 제공됩니다. 그러나 기본 키를 병행 할 때주의하십시오. 키가 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가이를 처리 할 수있는 것은 아님)에주의하십시오. 단축키를 분리하지 않고도 빠른 조인 가능성과 확장 가능성이있는 여러 열의 기본 및 외래 키를 정의 할 수 있습니다.

관련 문제