Oracle Join не возвращает данные, если 1 столбец пуст - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть запрос Oracle на получение цен на продукты для каждого клиента, но он возвращает строку только тогда, когда для клиента установлена ​​цена для каждого продукта (1, 4, 6, 189, 191, 7, 80, 235).

Как сделать так, чтобы он возвращал строку, даже если 1 столбец пуст?Я хочу строку для каждого клиента, не имеет значения, есть ли у него цена на продукт или нет.

Я пробовал также полное внешнее соединение, левое внешнее соединение в таблицах цен, но не имеет значения для результата.

Пример того, что я хочу:

900001,Some Customer,1.59,2.49,3.39,0,0,0,0,4.92

select
    ltrim(kust.kunr),
    kust_adr.ku_name,
    p1.sp_auf_m2,
    p2.sp_auf_m2,
    p3.sp_auf_m2,
    p4.sp_auf_m2,
    p5.sp_auf_m2,
    p6.sp_auf_m2,
    p7.sp_auf_m2,
    p8.sp_auf_m2
from
    kust
    inner join
        kust_adr
        on kust.kunr = kust_adr.ku_nr
    full outer join
        sp_przu p1
        on kust.kunr = p1.kunr
    full outer join
        sp_przu p2
        on kust.kunr = p2.kunr
    full outer join
        sp_przu p3
        on kust.kunr = p3.kunr
    full outer join
        sp_przu p4
        on kust.kunr = p4.kunr
    full outer join
        sp_przu p5
        on kust.kunr = p5.kunr
    full outer join
        sp_przu p6
        on kust.kunr = p6.kunr
    full outer join
        sp_przu p7
        on kust.kunr = p7.kunr
    full outer join
        sp_przu p8
        on kust.kunr = p8.kunr
where
    kust_adr.ku_adr_art = 0
    and p1.prl_nr = 2
    and p1.spr_nr = 1
    and p2.prl_nr = 2
    and p2.spr_nr = 4
    and p3.prl_nr = 2
    and p3.spr_nr = 6
    and p4.prl_nr = 2
    and p4.spr_nr = 189
    and p5.prl_nr = 2
    and p5.spr_nr = 191
    and p6.prl_nr = 2
    and p6.spr_nr = 7
    and p7.prl_nr = 2
    and p7.spr_nr = 80
    and p8.prl_nr = 2
    and p8.spr_nr = 235
order by
    kust.kunr;

1 Ответ

2 голосов
/ 05 апреля 2019

Ваши предложения and превращают внешние объединения обратно во внутренние - переместите их в соответствующие им предложения on:

select
    ltrim(kust.kunr),
    kust_adr.ku_name,
    p1.sp_auf_m2,
    p2.sp_auf_m2,
    p3.sp_auf_m2,
    p4.sp_auf_m2,
    p5.sp_auf_m2,
    p6.sp_auf_m2,
    p7.sp_auf_m2,
    p8.sp_auf_m2
from
    kust
    inner join
        kust_adr
        on kust.kunr = kust_adr.ku_nr
    full outer join
        sp_przu p1
        on kust.kunr = p1.kunr
        and p1.prl_nr = 2
        and p1.spr_nr = 1
    full outer join
        sp_przu p2
        on kust.kunr = p2.kunr
        and p2.prl_nr = 2
        and p2.spr_nr = 4
    full outer join
        sp_przu p3
        on kust.kunr = p3.kunr
        and p3.prl_nr = 2
        and p3.spr_nr = 6
    full outer join
        sp_przu p4
        on kust.kunr = p4.kunr
        and p4.prl_nr = 2
        and p4.spr_nr = 189
    full outer join
        sp_przu p5
        on kust.kunr = p5.kunr
        and p5.prl_nr = 2
        and p5.spr_nr = 191
    full outer join
        sp_przu p6
        on kust.kunr = p6.kunr
        and p6.prl_nr = 2
        and p6.spr_nr = 7
    full outer join
        sp_przu p7
        on kust.kunr = p7.kunr
        and p7.prl_nr = 2
        and p7.spr_nr = 80
    full outer join
        sp_przu p8
        on kust.kunr = p8.kunr
        and p8.prl_nr = 2
        and p8.spr_nr = 235
where
    kust_adr.ku_adr_art = 0
order by
    kust.kunr;

Я не уверен, действительно ли они должны быть полными внешними объединениями в любом случае;и может быть проще использовать одно внешнее объединение на основе пар значений, а затем повернуть этот результат, например:

select *
from (
    select
        ltrim(k.kunr) as kunr,
        ka.ku_name,
        p.spr_nr,
        p.sp_auf_m2
    from
        kust k
        inner join
            kust_adr ka
            on k.kunr = ka.ku_nr
        left outer join
            sp_przu p
            on k.kunr = p.kunr
            and p.prl_nr = 2
            and p.spr_nr in (1, 4, 6, 189, 191, 7, 80, 235)
    where
        ka.ku_adr_art = 0
)
pivot (
    max(sp_auf_m2) for (spr_nr) in (1, 4, 6, 189, 191, 7, 80, 235)
)
order by
    kunr;

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

ORA-00933: команда SQL не завершена должным образом ... это 10g

Предложение pivot не былодобавлено до 11g, но вы можете повторить то, что он делает, с помощью агрегированных выражений падежа (и в любом случае он делает это скрытно):

select
    ltrim(k.kunr) as kunr,
    ka.ku_name,
    max(case when p.spr_nr = 1 then p.sp_auf_m2 end) as sp_auf_m2_1,
    max(case when p.spr_nr = 4 then p.sp_auf_m2 end) as sp_auf_m2_4,
    max(case when p.spr_nr = 6 then p.sp_auf_m2 end) as sp_auf_m2_6,
    max(case when p.spr_nr = 189 then p.sp_auf_m2 end) as sp_auf_m2_189,
    max(case when p.spr_nr = 191 then p.sp_auf_m2 end) as sp_auf_m2_191,
    max(case when p.spr_nr = 7 then p.sp_auf_m2 end) as sp_auf_m2_7,
    max(case when p.spr_nr = 80 then p.sp_auf_m2 end) as sp_auf_m2_80,
    max(case when p.spr_nr = 235 then p.sp_auf_m2 end) as sp_auf_m2_235
from
    kust k
    inner join
        kust_adr ka
        on k.kunr = ka.ku_nr
    left outer join
        sp_przu p
        on k.kunr = p.kunr
        and p.prl_nr = 2
        and p.spr_nr in (1, 4, 6, 189, 191, 7, 80, 235)
where
    ka.ku_adr_art = 0
group by
    ltrim(k.kunr),
    ka.ku_name
order by
    kunr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...