2015-01-15 1 views
1

데이터베이스 테이블에 동일한 레코드를 저장하는 구조가 있습니다. 이 기록들은 형제라고 생각할 수 있습니다. 예를 들어이 테이블에는 두 개의 레코드가 있습니다. 1 = 2 및 1 = 3이다. 그리고 주어진 레코드의 모든 형제를 반환하는 쿼리가 필요합니다. 예를 들어 보겠습니다. 오라클 형제 구조

은 두 개의 열이 내 테이블 : 나는이 개 기록을 가지고

create table SIBLINGSTEST(col1 number, col2 number); 

= 2 1 = 3

insert into SIBLINGSTEST values(1,2); 
insert into SIBLINGSTEST values(1,3); 
나는에 의해 연결이 상황에 가장 적합한 솔루션입니다 사용하여 생각했다

1

SELECT * FROM SIBLINGSTEST 
START WITH (col1 = 1 or col2 = 1) 
CONNECT BY NOCYCLE (
      (PRIOR col1 = col1) or 
      (PRIOR col1 = col2) OR 
      (PRIOR col2 = col1) or 
      (PRIOR col2 = col2)) 

이 쿼리는 올바른 결과를 반환하여 두 행을 반환합니다.

매개 변수로 2를 사용하면 쿼리가 올바르게 실행되어 두 행을 모두 다시 반환합니다.

그러나 매개 변수로 3을 사용하면 예상 한대로 쿼리가 실행되지 않고 시작 행만 반환됩니다.

SELECT * FROM SIBLINGSTEST 
START WITH (col1 = 3 or col2 = 3) 
CONNECT BY NOCYCLE (
      (PRIOR col1 = col1) or 
      (PRIOR col1 = col2) OR 
      (PRIOR col2 = col1) or 
      (PRIOR col2 = col2)) 

왜 2와 3의 결과가 다른지 궁금합니다. 어떤 도움이나 아이디어라도 부각 될 것입니다.

감사합니다. 예상대로

+0

나는 그것을 얻지 않는다. 형제 란 무엇입니까? 한 열의 값이 두 번 이상 나타날 때? –

+0

본인의 예를 들어 설명해 드리겠습니다. 1과 2는 형제입니다. 1과 3도 형제입니다. 그래서 2와 3도 형제입니다 (간접적으로). 내 테이블에 삽입 할 때 중복 값 확인이 있는데,이 경우는 내 관심사입니다. –

+0

그리고 한 가지 더, 문제는 testin db에서 발생했으며, oracle 10g 버전 10.2를 실행 중입니다. 11g 데이터베이스에서 상황을 테스트 한 결과 아무런 문제가 없었습니다. 쿼리는 예상대로 실행됩니다. 11g으로 고정 된 버그라고 생각합니다. –

답변

0

나는 마지막 쿼리 두 행을 얻을 : 내가 선택하지 않을 그러나

SQL> SELECT * FROM SIBLINGSTEST 
    2 START WITH (col1 = 3 or col2 = 3) 
    3 CONNECT BY NOCYCLE (
    4   (PRIOR col1 = col1) or 
    5   (PRIOR col1 = col2) OR 
    6   (PRIOR col2 = col1) or 
    7   (PRIOR col2 = col2)); 

     COL1  COL2 
---------- ---------- 
     1   3 
     1   2 

이이 방법을 모델링 할 수 있습니다. 당신이 정말로 원하는 것은 1, 2, 3 형제라는 것을 기록하는 것입니다 경우, 내가 사용하는 것이 :

create table siblings_group (group_id number); 
create table people (person_id number, group_id number); 
insert into siblings_group values (1); 
insert into people values (1, 1); 
insert into people values (2, 1); 
insert into people values (3, 1); 

그런 다음 3의 모든 형제 자매를 찾기 위해 :

SQL> select person_id from people where group_id = 
    2 (select group_id from people where person_id=3); 

PERSON_ID 
---------- 
     1 
     2 
     3 
+0

답변 해 주셔서 감사합니다. 내가 언급 한 내용에서 오라클의 버그라고 생각합니다. 오라클 10g 버전 10.2를 실행하는 테스트 데이터베이스에서 문제가 발생했습니다. 11g 데이터베이스에서 상황을 테스트 한 결과 아무런 문제가 없었습니다. 내가 원하는대로 쿼리가 실행됩니다. 11g으로 고정 된 버그라고 생각합니다. –

+0

그리고 구조에 관해서는 그렇습니다. 논리적입니다. 하지만 당신의 구조는 내 고객의 실제 요구 사항을 충족시키지 못합니다. 나는 문제를 분열시켰다. 그러나 실제로, 우리는 관련 교육을 정의하기 위해 유사한 구조를 사용한다. 예를 들어, A = B, B = C, C = D, D = E와 같은 정의가 있습니다. C = D 관계가 삭제되면 A와 E는 더 이상 관련이 없을 것으로 예상되므로이 레코드를 그룹화 할 수 없습니다. 어쨌든, 내 고객은 오라클 버전 11g를 사용하고 있으며, 나는 그들의 환경에서 그것을 테스트하고 ok를 실행합니다 :) 당신의 대답에 감사드립니다. –