Как выбрать из двух разных таблиц с несколькими внешними ключами - PullRequest
2 голосов
/ 06 мая 2020

Сначала объясните, что мне нужно, используя изображение:

enter image description here

Вторая таблица создания:

CREATE SEQUENCE  SEQ_tab7  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 2206 NOCACHE  ORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL ;
CREATE SEQUENCE  SEQ_tab8  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 2206 NOCACHE  ORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL ;

CREATE TABLE TABLE_7 
(
     ID NUMBER(19,0) DEFAULT SEQ_tab7.nextval  NOT NULL
    ,DESCRIPTION    VARCHAR2(256) NOT NULL
    ,CONSTRAINT TAB_7_PK PRIMARY KEY (ID) ENABLE
);

CREATE TABLE TABLE_8 
(
     ID NUMBER(19,0) DEFAULT SEQ_tab8.nextval  NOT NULL
    ,FIELD_1    NUMBER(19,0) NOT NULL
    ,FIELD_2    NUMBER(19,0) NOT NULL
    ,FIELD_3    NUMBER(19,0) NOT NULL
    ,FIELD_4    VARCHAR2(256)
    ,CONSTRAINT TAB_8_PK PRIMARY KEY (ID) ENABLE
    ,CONSTRAINT tab_8_FIELD_1_FK FOREIGN KEY (FIELD_1) REFERENCES TABLE_7(ID) 
    ,CONSTRAINT tab_8_FIELD_2_FK FOREIGN KEY (FIELD_2) REFERENCES TABLE_7(ID) 
    ,CONSTRAINT tab_8_FIELD_3_FK FOREIGN KEY (FIELD_3) REFERENCES TABLE_7(ID) 
);

Третья - вставки:

Insert into TABLE_7 (ID,DESCRIPTION) values ('1','desc_1');
Insert into TABLE_7 (ID,DESCRIPTION) values ('2','desc_2');
Insert into TABLE_7 (ID,DESCRIPTION) values ('3','desc_3');


Insert into TABLE_8 (ID,FIELD_1,FIELD_2,FIELD_3,FIELD_4) values ('23','1','2','1','lorem_1');
Insert into TABLE_8 (ID,FIELD_1,FIELD_2,FIELD_3,FIELD_4) values ('43','1','3','3','lorem_2');
Insert into TABLE_8 (ID,FIELD_1,FIELD_2,FIELD_3,FIELD_4) values ('54','3','3','3','lorem_3');

Как я могу получить желаемый результат?

С уважением

Ответы [ 2 ]

4 голосов
/ 06 мая 2020

Использовать несколько объединений

Попробуйте следующее:

SELECT Base.ID, FirstJoin.Desc, SecondJoin.Desc, ThirdJoin.Desc, Base.field_4
FROM table_2 Base
JOIN table_1 FirstJoin ON FirstJoin.ID = Base.Field_1
JOIN table_1 SecondJoin ON SecondJoin.ID = Base.Field_2
JOIN table_1 ThirdJoin ON ThirdJoin.ID = Base.Field_3
1 голос
/ 06 мая 2020

Вот пример использования подзапросов для каждого field_? он будет искать описание в table_1 и использовать его как атрибут. Я добавил псевдоним для поля, чтобы сделать вывод более понятным.

SELECT 
  table_2.id, 
  (SELECT table_1.desc FROM table_1 WHERE table_1.id=table_2.field_1) as "FIELD_1",
  (SELECT table_1.desc FROM table_1 WHERE table_1.id=table_2.field_2) as "FIELD_2",
  (SELECT table_1.desc FROM table_1 WHERE table_1.id=table_2.field_3) as "FIELD_3",
  table_2.field_4
FROM table_2;

Например, первая строка таблицы_2 - (id=23, field_1=1, field_2=2, field_3=1, field_4="lorem_1") Второй атрибут после выполнения предложенного запроса будет результатом запроса SELECT table_1.desc FROM table_1 WHERE table_1.id=table_2.field_1 что составляет "desc_1" и тот же процесс для field_2 и field_3 в этом случае результат для первой строки будет:

ID  FIELD_1 FIELD_2 FIELD_3 FIELD_4
23  desc_1  desc_2  desc_1  lorem_1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...