2011-09-25 2 views
1

그래서이 데이터는 다음과 같이 느슨하게 배치 가지고하나의 (제외 된) 열에서 DISTINCT를 (를) 선택할 수 있지만 다른 열은 쿼리에 포함 할 수 있습니까? (오라클)

표 1 - PEOPLE : person_id로 (기본 키) PARENT_ID가 child_id가 other_parent_fields가

표 2 other_child_fields - : 부모 차 증가 PARENT_ID (자동 (부모 키를 참조하는 외래 키)

PEOPLE 테이블에서 모든 다른 부모를 쿼리 할 수 ​​있기를 원합니다. other_parent_fields를 모두 PARENTS 테이블에 넣고, 표 1의 old parent_id를 던져 버린다. 표 2

내 자동 증분 PARENT_ID의 R 나는 또한 어린이를위한 동일한 작업을 수행, 만 3

기본적으로 테이블 2 테이블에서 내 자신의 ID를 사용하여 부모 - 자식 관계를 유지하려는

, 데이터베이스 설계 방식을 변경하려고합니다. 모든 사람들을위한 전체 테이블 대신 PARENTS 테이블과 CHILDREN 테이블을 만들고 있는데, 후자는 외래 키가있는 PARENTS를 참조합니다. 테이블 1의 ID를 버리는 이유는 새 테이블에서 해당 테이블을 돌볼 이유가 없기 때문입니다. 즉, 번호 매기기는 하나부터 시작하고 추가 항목은 기본 키를 자동으로 증가시킬 수 있습니다. 그러나 이러한 ID를 표 1에서 삭제하기 전에 릴레이하는 부모 - 자식 관계를 캡처해야합니다.

이것도 가능합니까? 어떻게 그 일을 할 것인가?

우리 아이는 아이들이 누군가가 부모와 아이 캔트 즉하지 않았는지 간단하게하기 위해, 가정 할 수

+0

이 작업은 SQL에서만 수행해야합니까? 이 작업을 위해 인터페이스하는 응용 프로그램을 작성할 수 있습니까? 또는 pl/sql을 사용해야합니까? – TJR

+0

SQL을 사용해야 만합니다. – finiteloop

+0

나는 처음에 새 테이블과 유사한 임시 테이블을 만들 것이라고 생각하지만 이전 ID를 보유하는 열을 추가하고 이전 데이터를 다시 참조하기 위해이 쿼리를 사용하여 쿼리를 작성해야합니다. –

답변

2

나는 완전히 당신의 질문을 이해하지 못했지만 당신이 첫 번째 쿼리이 (SQL 서버 구문) 될 것으로 보인다 :

insert into Parents 
select other_parent_fields, person_id as legacy_parent_id 
from (select distinct person_id, other_parent_fields from PEOPLE where parent_id is null) x 

트릭은 parent_id, other_parent_fields에서 먼저 그룹화 한 다음 parent_id를 삭제하는 것입니다. (뚜렷한 것은 *에 의한 그룹과 같습니다). 위 쿼리는 other_parent_fields가 parent_id의 순수 함수 인 경우에만 작동합니다. 귀하의 질문을 비정규 화 된 데이터를 정규화하려는 시도로 해석하므로 이것이 사실이라고 생각합니다.

insert into Children 
select other_child_fields, parent_id as legacy_parent_id 
from (select distinct person_id, other_child_fields from PEOPLE where parent_id is not null) x 

는 이제 테이블이 서로 다른 부모와 자녀뿐만 아니라 기존 ID를 포함 : 당신이 할 수있는 아이들을 추출하기 위해

. 이제 새 부모 ID를 자식 테이블에 할당하는 업데이트 쿼리를 작성해야합니다. 그런 다음 레거시 필드를 삭제합니다.

+0

원본 질문에 명확한 부분을 추가했습니다. – finiteloop

+0

원래 쿼리를 수정하고 누락 된 쿼리를 추가했습니다. – usr

+0

+1 오라클 구문은 동일합니다 ... – Ben

관련 문제