2017-02-17 10 views
0

"List of foreign keys and the tables they reference"을 사용하면 조인 테이블의 이름과 조인 할 테이블의 이름을 가져올 수 있지만 세 번째 테이블의 이름은 알 수 없습니다. 세 테이블/필드를 다 대다 (many-to-many)와 관련되게하려면 어떻게합니까? 내가 얻는 방법 (두 번째 행에 r2_ *주의) 다음many-to-many 조인에 관련된 테이블과 컬럼 이름을 얻으려면 어떻게해야합니까?

예를 들어

:

TableName Field  r_TableName r_Field r2_TableName r2_Field 
Users  VehicleId Vehicles Id  NULL   NULL 
UserGroups UserId  Groups  Id  Users   Id 
Cats  UserId  Users  Id  NULL   NULL 

주어진 다음의 표 : 나는 변화와 함께 일한지

CREATE TABLE Users(
    Id NUMBER(10,0), 
    UserName NVARCHAR2(20), 
    VehicleId NUMBER(10,0), 
    CONSTRAINT user_pk PRIMARY KEY(ID) 
); 
ALTER TABLE Users ADD CONSTRAINT 
    users__vehicle_fk FOREIGN KEY(VehicleId) REFERENCES Vehicles(Id) ENABLE; 
CREATE TABLE Vehicles(
    ID NUMBER(10,0), 
    VehicleName NVARCHAR2(20), 
    CONSTRAINT vehicle_pk PRIMARY KEY(ID) 
); 
CREATE TABLE Cats(
    ID NUMBER(10,0), 
    CatName NVARCHAR2(20), 
    UserId NUMBER(10,0), 
    CONSTRAINT cat_pk PRIMARY KEY(ID) 
); 
ALTER TABLE Cats ADD CONSTRAINT 
    cat__user_fk FOREIGN KEY(UserId) REFERENCES Users(ID) ENABLE; 
CREATE TABLE Groups(
    Id NUMBER(10,0), 
    GroupName NVARCHAR2(20), 
    CONSTRAINT group_pk PRIMARY KEY(ID) 
); 
CREATE TABLE UserGroups (
    UserId NUMBER(10,0), 
    GroupId NUMBER(10,0), 
    CONSTRAINT user__groups_pk PRIMARY KEY(UserId, GroupId) 
); 
ALTER TABLE UserGroups ADD CONSTRAINT 
    userGroups__user_fk FOREIGN KEY(UserId) REFERENCES Users(Id) ENABLE; 
ALTER TABLE UserGroups ADD CONSTRAINT 
    userGroups__group_fk FOREIGN KEY(GroupId) REFERENCES GROUPS(ID) ENABLE; 

의 :

SELECT ac1.OWNER, ac1.CONSTRAINT_NAME, ac1.CONSTRAINT_TYPE, ac1.TABLE_NAME, 
    ac1.R_OWNER, ac1.R_CONSTRAINT_NAME, '@@@@@@@@@@' 
    , ac2.OWNER, ac2.CONSTRAINT_NAME, ac2.CONSTRAINT_TYPE, ac2.TABLE_NAME, 
    ac2.R_OWNER, ac2.R_CONSTRAINT_NAME, '@@@@@@@@@@' 
    ,conscols.*, '@@@@@@@@@@' 
    ,r_conscols.* 
FROM all_constraints ac1 
JOIN all_constraints ac2 
    ON ac1.r_constraint_name = ac2.constraint_name 
    AND ac1.owner = ac2.owner 
JOIN all_cons_columns conscols 
    ON ac1.owner = conscols.owner 
    AND ac1.CONSTRAINT_NAME = conscols.constraint_name 
JOIN all_cons_columns r_conscols 
    ON ac2.owner = r_conscols.owner 
    AND ac2.CONSTRAINT_NAME = r_conscols.constraint_name 
    AND r_conscols.POSITION = conscols.POSITION 

내 샘플에 세 개의 행의 두 번째와 같은 간접적 인 관계에 대한 원시 데이터를 (볼 수 있습니다 출력). 그러나 직접 관계로 데이터를 결합하는 명확한 방법이 없기 때문에 모두 동일한 M : M 조인을 포함한다는 것을 알 수 있습니다.

주 : 많은 것보다 깊은 관계 : 단일 조인 테이블을 사용하는 많은 것을 고려할 필요가 없습니다.

이 데이터를 함께 수집하려면 어떻게해야합니까?

답변

0

내가 원하는 것은 아니지만 100 % 조인이 아닌 외부 조인을 사용하려고 했습니까?

SELECT ac1.owner 
    , ac1.constraint_name 
    , ac1.constraint_type 
    , ac1.table_name 
    , ac1.r_owner 
    , ac1.r_constraint_name 
    , '@@@@@@@@@@' 
    , ac2.owner 
    , ac2.constraint_name 
    , ac2.constraint_type 
    , ac2.table_name 
    , ac2.r_owner 
    , ac2.r_constraint_name 
    , '@@@@@@@@@@' 
    , conscols.* 
    , '@@@@@@@@@@' 
    , r_conscols.* 
    FROM user_constraints ac1 
     LEFT OUTER JOIN user_constraints ac2 
      ON ac1.r_constraint_name = ac2.constraint_name 
      AND ac1.owner = ac2.owner 
     LEFT OUTER JOIN user_cons_columns conscols 
      ON ac1.owner = conscols.owner 
      AND ac1.constraint_name = conscols.constraint_name 
     LEFT OUTER JOIN user_cons_columns r_conscols 
      ON ac2.owner = r_conscols.owner 
      AND ac2.constraint_name = r_conscols.constraint_name 
      AND r_conscols.position = conscols.position 
+0

응답 해 주셔서 감사합니다. 그러나 이것은 내가 찾고있는 것이 아닙니다. –