Используя «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.
Примечание: Отношения, которые идут глубже, чем многие: многие, используя единую таблицу соединений, не должны рассматриваться.
Как добиться совместного использования этих данных?
Благодарим за отзыв, но это не совсем то, что я искал. –