#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