Каков правильный синтаксис Oracle для вложенных выборок, ссылающихся на те же таблицы? - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь написать запрос, но я не уверен, что то, что я пытаюсь сделать, правильно. Лучший способ объяснить это - показать, что я хочу и что у меня есть

Что я хочу:



   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 &ltregular query stuff>...

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Мне кажется, я решил это и опубликовал ответ в оригинальном сообщении

0 голосов
/ 06 декабря 2011

Если я что-то упустил, я не понимаю, зачем вам вообще нужен подзапрос:

select
  tblA.id as "ID", 
  tblB.someCol as "SomeCol1",
  tblD.someOtherCol as "SomeCol2",
  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';
...