Я пытаюсь написать запрос, но я не уверен, что то, что я пытаюсь сделать, правильно. Лучший способ объяснить это - показать, что я хочу и что у меня есть
Что я хочу:
ID | SomeCol1 | SomeCol2 | Fish | Cat
-------------------------------------
1 foo bar baz boz
2 foo2 bar2 baz2 boz2
Что у меня есть:
select
tblA.id as "ID",
tblB.someCol as "SomeCol1",
tblD.someOtherCol as "SomeCol2"
from TableA tblA
inner join TableB tblB on tblA.fkId1=tblB.id
inner join TableC tblC on tblA.id=tblC.fkId2
inner join TableD tblD on tblC.fkId8=tblD.id
inner join TableE tblE on tblC.fkId9=tblE.id
Это правильно дает мне первые 3 столбца.
Этот отдельный запрос дает мне правильный столбец / значения для 'Fish'
select tblE.someCol as "Fish"
from TableA tblA
inner join TableB tblB on tblA.fkId1=tblB.id
inner join TableC tblC on tblA.id=tblC.fkId2
inner join TableD tblD on tblC.fkId8=tblD.id
inner join TableE tblE on tblC.fkId9=tblE.id
where tblD.someOtherColumn = 'Fish';
Я бы сделал аналогичный для кошки, используя те же таблицы.
Однако, если я попытаюсь объединить запросы, вложив выборки следующим образом, я, очевидно, получу ошибку «Подзапрос из одной строки возвращает более 1 строки).
select
tblA.id as "ID",
tblB.someCol as "SomeCol1",
tblD.someOtherCol as "SomeCol2",
(select tblE.someCol as "Fish"
from TableA tblA
inner join TableB tblB on tblA.fkId1=tblB.id
inner join TableC tblC on tblA.id=tblC.fkId2
inner join TableD tblD on tblC.fkId8=tblD.id
inner join TableE tblE on tblC.fkId9=tblE.id
where tblD.someOtherColumn = 'Fish'),
(select tblE.someCol as "Cat"
from TableA tblA
inner join TableB tblB on tblA.fkId1=tblB.id
inner join TableC tblC on tblA.id=tblC.fkId2
inner join TableD tblD on tblC.fkId8=tblD.id
inner join TableE tblE on tblC.fkId9=tblE.id
where tblD.someOtherColumn = 'Cat')
from TableA tblA
inner join TableB tblB on tblA.fkId1=tblB.id
inner join TableC tblC on tblA.id=tblC.fkId2
inner join TableD tblD on tblC.fkId8=tblD.id
inner join TableE tblE on tblC.fkId9=tblE.id
Итак, как бы я правильно сделал это? Также есть ли способ ссылаться на таблицы только один раз, а не несколько раз, как показано выше? * Мой реальный запрос более сложен и содержит больше таблиц для объединения и около 15 столбцов, которые должны выполнять ту же логику, что и столбец «Рыба».
Спасибо!
** ОБНОВЛЕНИЕ - думаю, я понял это. Мне нужно создать подзапрос один раз с помощью команды «с». Затем я создаю подзапросы из этого:
with v_tbl as (
select *
from TableA tblA
inner join TableB tblB on tblA.fkId1=tblB.id
inner join TableC tblC on tblA.id=tblC.fkId2
inner join TableD tblD on tblC.fkId8=tblD.id
inner join TableE tblE on tblC.fkId9=tblE.id
), v_fish as (select name from v_tbl where tblD.someOtherColumn = 'Fish')
, v_cat as (select name from v_tbl where tblD.someOtherColumn = 'Cat')
select <regular query stuff>...