【问题标题】:How do I get the table and column names involved in a many-to-many join?如何获取多对多连接中涉及的表名和列名?
【发布时间】:2017-07-07 14:26:55
【问题描述】:

使用“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;

我一直在使用以下变体:

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 加入。

注意:不需要考虑使用单个连接表比 many:many 更深入的关系。

如何将这些数据整合在一起?

【问题讨论】:

    标签: oracle oracle11g many-to-many jointable database-metadata


    【解决方案1】:

    我不能 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
    

    【讨论】:

    • 感谢您的回复,但这并不是我想要的。
    猜你喜欢
    • 2013-09-19
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多