Почему запрос внешнего соединения не работает? - PullRequest
1 голос
/ 19 апреля 2011

Алло, Моя цель состоит в том, чтобы сгенерировать таблицу, в которой показана сумма каждого КОДА, принадлежащего владельцу. Обратите внимание, что к каждому владельцу должен быть привязан КОД, независимо от того, ОБЩЕЕ значение равно нулю. Таким образом, к каждому из APPROVAL_ID будет привязано APP, REJ, CAN.

APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
102          CAN   0
103          APP   0
103          REJ   0
103          CAN   4

Итак, вот исходный код:

select approval_id, code, total
from (
  select 'APP' code, '1' seq from dual
  union all
  select 'REJ' code, '2' seq from dual
  union all
  select 'CAN' code, '3' seq from dual
)
left outer join (
      select m.approval_id, own.name, m.decision, count(*) total, 
      case own.channel
          when 'CH1' then 'CH1'
          when 'CH2' then 'CH2'
          else 'Others Channel'
      end the_channel
      from tableM m, owner own
      where m.decision in ('REJ', 'APP', 'CAN')
      and own.id=m.approval_id
      group by m.approval_id, own.name, m.decision, own.channel
      order by m.approval_id
)
on code=decision
group by approval_id, code, total
order by approval_id;

Вывод вышеуказанного запроса выглядит следующим образом:

APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
103          CAN   4

Вывод внутреннего запроса выглядит следующим образом:

APPROVAL_ID  CODE  TOTAL
-----------  ----  -----
101          APP   2
101          REJ   1
101          CAN   3
102          APP   2
102          REJ   4
103          CAN   4

Что-то было не так в запросе, потому что я знаю, что у некоторой строки общее значение равно нулю, в ней должно быть напечатано что-то вроде (нулевого) значения. Но почему это скрыто от глаз? Что-то не так с моим запросом?

Спасибо @!

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Во-первых, вам нужно сделать перекрестное соединение между вашим владельцем и вашей кодовой таблицей.Затем вы выполняете левое соединение.

Я смоделировал 3 таблицы: введите 3 строки APP, REJ и CAN, затем таблицу пользователей, эквивалентную таблице вашего владельца, и решение третьей таблицы, эквивалентное вашейtableM.

Запрос выглядит следующим образом:

SELECT c.user_id, c.type_code, COUNT(d.id)
FROM
(

    SELECT t.ID as type_id, u.id as user_id, t.CODE as type_code
    FROM Type t, Userr u
) c 
    LEFT OUTER JOIN Decision d 
            ON d.user_id = c.user_id
            AND d.type_id = c.type_id
GROUP BY c.user_id, c.type_code

Не проверено, но для вашего набора таблиц:

select a.id_own, a.code, count(m.approval_id)
from
    (
        select code, own.id as id_own
        from (
          select 'APP' code, '1' seq from dual
          union all
          select 'REJ' code, '2' seq from dual
          union all
          select 'CAN' code, '3' seq from dual
        ) , owner own
    ) a
    left outer join tableM m
on a.code = m.decision
and a.id_own = m.approval_id
group by a.id_own, a.code
order by a.id_own

Обратите внимание, что количество (m.approval_id)выдаст вам номер параметраree_id, который в левом соединении будет отличен от нуля.

1 голос
/ 19 апреля 2011

Ваше внешнее соединение в коде = решение.Это означает, что вы получаете по одной строке для каждого кода, который не является решением с правой стороны.Очевидно, что вы хотите выполнить левое соединение с перекрестным соединением из 3 кодов и всех различных APPROVAL_ID, дающих все комбинации кода и APPROVAL_ID на левой стороне.

0 голосов
/ 19 апреля 2011

Мое первое предположение состоит в том, что

group by approval_id, code, total

должно быть

group by approval_id, code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...