Несколько таблиц, соединенных в таблицу с помощью одного столбца

#sql #oracle #performance #oracle11g #oracle-sqldeveloper

Вопрос:

Я пытаюсь создать запрос по приведенному ниже сценарию.

введите описание изображения здесь

с моими навыками я могу присоединиться к таблицам A,A1,B и A,A1,C и A,A1,D по отдельности и объединить их.

Есть ли лучший способ добиться того же самого. Я использую Oracle в качестве базы данных.

Ответ №1:

Все зависит от того, что они означают, и если вам нужно знать столбцы, из которых взяты значения.

Это приведет к получению всех столбцов, и у вас будут NULL значения из несоответствующих таблиц B, C, D:

 SELECT * FROM a1  INNER JOIN a ON a1.aid = a.id  LEFT OUTER JOIN b ON a.extid = b.extid  LEFT OUTER JOIN c ON a.extid = c.extid  LEFT OUTER JOIN d ON a.extid = d.extid  

Или это приведет к получению только соответствующих значений и даст вам тип, к которому они принадлежат, в меньшем количестве столбцов:

 SELECT * FROM a1  INNER JOIN a ON a1.aid = a.id  INNER JOIN (  SELECT extid, 'B' AS type, pqr_col AS col1, qrs_col AS col2 FROM b  UNION ALL  SELECT extid, 'C', abc_col, bcd_col FROM c  UNION ALL  SELECT extid, 'D', xyz_col, yza_col FROM d  ) bcd  ON a.extid = bcd.extid  

Ответ №2:

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

 create view v_ext as  select b.extid, b.pqr_col, b.qrs_col from b  union all  select c.extid, c.abc_col, c.bcd_col from c  union all  select d.extid, d.xyz_col, d.yza_col from d;   select * from a join a1 on a.id = a1.aid  join v_ext v on v.extid = a.extid;  

Ответ №3:

вы можете попробовать выполнить запрос с предложением «with». Что-то вроде приведенного ниже, хотя я этого не проверял

 with union_output as  ( select b.extid, b.pqr_col, b.qrs_col from b  union  select c.extid, c.abc_col, c.bcd_col from c  union  select d.extid, d.xyz_col, d.yza_col from d)  select * from a join a1 on a.id = a1.aid  join union_output uo on uo.extid = a.extid;  

Ответ №4:

 Select *from tableA A Inner join tableA1 A1 on A1.A1ID=A.AID  Inner join tableB b on b.ExtID=A.ExtID Inner join tableC c on c.ExtID=A.ExtID Inner join tableD d on d.ExtID=A.ExtID