2017-02-17 12 views
0

Используя «List of foreign keys and the tables they reference», я могу получить имя таблицы соединения и таблицы, в которую она соединяется, но не имя третьей таблицы. Как мне получить все три таблицы/поля, участвующие во многих?Как получить имена таблиц и столбцов, участвующих в соединении «многие-ко-многим»?

Например, как я получаю следующее (обратите внимание на r2_ * на втором ряду):

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; 

я работал с вариациями of

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 

Я могу видеть необработанные данные для косвенных отношений (например, второй из трех строк в моем примере output), но я не вижу четкого способа объединения этих данных с прямыми отношениями, так что я знаю, что все они связаны с тем же M: M join.

Примечание: Отношения, которые идут глубже, чем многие: многие, используя единую таблицу соединений, не должны рассматриваться.

Как добиться совместного использования этих данных?

ответ

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

Благодарим за отзыв, но это не совсем то, что я искал. –

 Смежные вопросы

  • Нет связанных вопросов^_^