database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39555 게시물 읽기
No. 39555
내가 참조고자 하는테이블의 컬럼과 나를 참조하는 테이블의 컬럼을 찾을려고 합니다.
작성자
강옥석(sspkos)
작성일
2012-07-24 01:07
조회수
5,942

데이타베이스 DICTIONARY관련한 기능들을 참조하여 기능을 구현하려고 합니다.

아래 쿼리는 GLP05M이라는 테이블이  참조하고자 하는테이블(부모테이블 GLP01M)의 PRIMARY KEY 컬럼을 찾고자 하는 쿼리 이구요  

SELECT FORTBL.CONSTRAINT_NAME,
                IDXTBL.COLUMN_NAME,
                IDXTBL.COLUMN_POSITION
    FROM SYS.ALL_CONSTRAINTS FORTBL,
                SYS.ALL_CONSTRAINTS REFTBL,
               SYS.ALL_IND_COLUMNS IDXTBL 

WHERE FORTBL.OWNER             = REFTBL.OWNER
      AND FORTBL.CONSTRAINT_TYPE   = 'R'
      AND REFTBL.CONSTRAINT_TYPE   = 'P'
      AND FORTBL.OWNER             = 'CNSONE'
      AND FORTBL.TABLE_NAME        = 'GLP05M'
      AND FORTBL.R_CONSTRAINT_NAME = REFTBL.CONSTRAINT_NAME
      AND FORTBL.OWNER             = IDXTBL.TABLE_OWNER
      AND FORTBL.TABLE_NAME        = IDXTBL.TABLE_NAME
  ORDER BY FORTBL.CONSTRAINT_NAME, IDXTBL.COLUMN_POSITION ASC

실행시

FK_GLP05M_GLP01M_2    PART_MAT_CODE            1
FK_GLP05M_GLP01M_2    PO_NO                                 1     ------------------------->이  ROW와
FK_GLP05M_GLP01M_2    PO_LINE_STUS_CODE    1
FK_GLP05M_GLP01M_2    PART_NO                             1
FK_GLP05M_GLP01M_2    PO_STUS_CHNG_DT      1
FK_GLP05M_GLP01M_2    PND                                      1
FK_GLP05M_GLP01M_2    BUYR_ID                              1
FK_GLP05M_GLP01M_2    PO_LINE_STUS_CODE    2
FK_GLP05M_GLP01M_2    PO_LNNO                            2 ------------------------------->이  ROW가               GLP01M 의 PRIMARY KEY 입니다.
FK_GLP05M_GLP01M_2    POR_NO                              2


FK_GLP05M_GLP01M_2    PO_NO                              1
FK_GLP05M_GLP01M_2    PO_LNNO                            2

이렇게만 나오게 하고 싶습니다. 그런데 잘 되지 않네요!!!

 

 
아래 쿼리는 GLP05M이라는 테이블을 참조하는 테이블들의 컬럼을 가져 오는 쿼리입니다.

   SELECT REF_TBL.CONSTRAINT_NAME,
                   IND_COL.COLUMN_NAME,
                   IND_COL.COLUMN_POSITION
     FROM SYS.ALL_CONSTRAINTS FOR_TBL,
                 SYS.ALL_CONSTRAINTS REF_TBL,
                 SYS.ALL_IND_COLUMNS IND_COL
   WHERE FOR_TBL.OWNER             = 'CNSONE'
      AND FOR_TBL.TABLE_NAME        = 'GLP05M'
      AND FOR_TBL.CONSTRAINT_TYPE   = 'P'
      AND FOR_TBL.OWNER             = REF_TBL.R_OWNER
      AND FOR_TBL.CONSTRAINT_NAME   = REF_TBL.R_CONSTRAINT_NAME
      AND FOR_TBL.OWNER             = IND_COL.TABLE_OWNER
      AND FOR_TBL.TABLE_NAME        = IND_COL.TABLE_NAME
      AND FOR_TBL.CONSTRAINT_NAME   = IND_COL.INDEX_NAME
 ORDER BY REF_TBL.CONSTRAINT_NAME ASC,
          IND_COL.COLUMN_POSITION ASC

실행시

FK_GLP10M_GLP05M_1    PO_NO        1
FK_GLP10M_GLP05M_1    PO_LNNO    2   

FK_GLP11C_GLP05M_1    PO_NO         1
FK_GLP11C_GLP05M_1    PO_LNNO    2

아래쿼리는 정상적으로 가져오는거 같습니다.(아래의 쿼리는 GLP10M과 ,GLP11C에서 GLP05M)을 참조한다고 설명될 수 있습니다.).

 

문제는 위의 쿼리에서 부모테이블의 PRIMARY 컬럼과 다른 KEY의 컬럼들도 같이

가져온다는데 문제가 있습니다.

부모테이블의 PRIMARY KEY 컬럼만 가져 올려고 할때 도움을 요청합니다.

도움 부탁 드립니다.

수고하십시오!!



 

이 글에 대한 댓글이 총 7건 있습니다.

-- 변경전 --
-- AND fortbl.owner       = idxtbl.table_owner
-- AND fortbl.table_name  = idxtbl.table_name
-- 변경후 --
   AND reftbl.index_owner = idxtbl.index_owner
   AND reftbl.index_name  = idxtbl.index_name

마농(manon94)님이 2012-07-24 08:15에 작성한 댓글입니다.
이 댓글은 2012-07-24 08:17에 마지막으로 수정되었습니다.

항상 도움만 받습니다. 그리고 감사합니다.

마농님께서 지적하신대로 내용을 수정하고 실행하였으나 일치하는 데이타가 나오지 않았습니다.

아래쿼리의 remark 부분이 마농님이 지적하신거구요 .... 그래서 데이타가 나올 수 있는 컬럼들을

다 명시를 하였습니다. 또한 데이타가 나올 수 있는데 까지 해서 화면에 실행결과를 첨부 하였습니다.

내용을 확인 부탁 드립니다.... 본 쿼리는 오너와 테이블만 수정이 된다면 어떤 환경에서도 가능한

쿼리입니다. 제가 제시하지 않은 테이블이라도 참조하시어 결과를 볼수 있었으면 합니다.

다시한번 답변 주심에 감사를 드립니다.

select
FORTBL.OWNER  ,             
FORTBL.CONSTRAINT_NAME ,    
FORTBL.CONSTRAINT_TYPE ,    
FORTBL.TABLE_NAME ,         
FORTBL.R_OWNER    ,         
FORTBL.R_CONSTRAINT_NAME ,  
FORTBL.INDEX_OWNER    ,     
FORTBL.INDEX_NAME   ,       
IDXTBL.INDEX_OWNER,         
IDXTBL.INDEX_NAME ,         
IDXTBL.TABLE_OWNER,         
IDXTBL.TABLE_NAME ,         
IDXTBL.COLUMN_NAME ,        
IDXTBL.COLUMN_POSITION ,
REFTBL.OWNER  ,             
REFTBL.CONSTRAINT_NAME ,    
REFTBL.CONSTRAINT_TYPE ,    
REFTBL.TABLE_NAME ,         
REFTBL.R_OWNER    ,         
REFTBL.R_CONSTRAINT_NAME ,  
REFTBL.INDEX_OWNER    ,     
REFTBL.INDEX_NAME  
from     ALL_CONSTRAINTS FORTBL,ALL_IND_COLUMNS IDXTBL,SYS.ALL_CONSTRAINTS REFTBL
    WHERE FORTBL.OWNER             = REFTBL.OWNER
      AND FORTBL.CONSTRAINT_TYPE   = 'R'
      AND REFTBL.CONSTRAINT_TYPE   = 'P'
      AND FORTBL.OWNER             = 'CNSONE'
      AND FORTBL.TABLE_NAME        = 'GLP05M'
      AND FORTBL.R_CONSTRAINT_NAME = REFTBL.CONSTRAINT_NAME

--   AND reftbl.index_owner = idxtbl.index_owner
--   AND reftbl.index_name  = idxtbl.index_name
      AND FORTBL.OWNER             = IDXTBL.TABLE_OWNER
      AND FORTBL.TABLE_NAME        = IDXTBL.TABLE_NAME
  ORDER BY FORTBL.CONSTRAINT_NAME, IDXTBL.COLUMN_POSITION ASC
 

강옥석(sspkos)님이 2012-07-24 10:56에 작성한 댓글입니다.
이 댓글은 2012-07-24 10:57에 마지막으로 수정되었습니다.

두줄 삭제하고 두줄 추가하라는 의미인데요.

혹시, 삭제 없이 추가만 하신건 아닌지요?

마농(manon94)님이 2012-07-24 12:45에 작성한 댓글입니다.

빠른 답변감사합니다.

현재 remark사항을 풀고 아래 두줄을 삭제하고 테스트를 했습니다.

 

물론 현재 화면의 쿼리에서

AND IDXTBL.INDEX_NAME        LIKE 'PK%' 를 넣고 하면 정상적으로 데이타를 찾아오기는합니다만

저희들은 대부분의 Constraint는 naming rule화 하여 사용합니다. 그러나 타사 사이트로 갔을때

이런 naming rule적용되지 않을때 문제가 발생함에 따라 마농님께 요청하였던 사항입니다.

프로그램의 예는 다음 화면과 같습니다.

 

화면 우측 하단에 표기 되는 내용이 좀 어려워서 부탁드렸습니다.

현재 임시방편으로는 출력이 됩니다만 ...^^;

강옥석(sspkos)님이 2012-07-24 13:27에 작성한 댓글입니다.

아~ reftbl.index_owner 에 값이 없네요?????
당연히 있을 거라 생각했다는.....왜 없는지? 의문???
 WHERE fortbl.owner           = 'CNSONE'
   AND fortbl.table_name      = 'GLP05M'
   AND fortbl.constraint_type = 'R'
   AND reftbl.constraint_type = 'P'
   AND reftbl.owner           = fortbl.r_owner
   AND reftbl.constraint_name = fortbl.r_constraint_name
   AND idxtbl.index_owner     = reftbl.owner
   AND idxtbl.index_name      = reftbl.index_name
;

마농(manon94)님이 2012-07-24 14:30에 작성한 댓글입니다.

여러가지로 도움주심 감사합니다.

일단 여기까지 나온걸로 좀 더 고민을 해 보겠습니다.

사실 parant key가 2개의 컬럼으로 되어 있어서 2row가 display 되야 됩니다.

이건 제 못인거 같습니다.

항상 친절히 답변해 주심에 감사합니다.

무더운 여름철입니다 건강 챙기시구요 ... 행복하세요!!!!!

강옥석(sspkos)님이 2012-07-24 15:08에 작성한 댓글입니다.

~~아 죄송합니다.

마농님이 주신 내용이 맞습니다. 제가 일부 착각을 했습니다.

GLP01M은 PRIMARY KEY가 PO_NO 하나가 맞습니다.

이쿼리는 어떤 누구도 써 먹을 수가 있겠네요 ~~ 마농님 덕분입니다.

^^ 감사합니다. ^^

강옥석(sspkos)님이 2012-07-24 17:08에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39558Oracle 10g Windows 2008 R2 64비트에 설치시 데이터베이스가 생성되지 않아요
잔뇌
2012-07-24
6711
39557연속적인 숫자를 그룹으로 최소값,최대값을 어떻게 추출하는지 [2]
열씨미
2012-07-24
5588
39556빈칸 채우기 [2]
정영목
2012-07-24
5288
39555내가 참조고자 하는테이블의 컬럼과 나를 참조하는 테이블의 컬럼을 찾을려고 합니다. [7]
강옥석
2012-07-24
5942
39554'%'가 있을때 숫자계산하기 [1]
초보
2012-07-23
4275
39553oracle golden gateway 에 대하여 아시는 분 계시나요? [2]
김흥수
2012-07-23
4738
39552데이터 중에 깨진한글 파일 등을 조회하는 방법이 있을까요
강대성
2012-07-20
4753
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.025초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다