Несколько левых объединений в одном выражении - PullRequest
1 голос
/ 08 июля 2019

У меня есть несколько запросов, которые я пытаюсь объединить в один без удачи.Я использую левое соединение на одной и той же таблице дважды с другим полем, и это звучит неправильно.

SELECT a.* 
     , b.CODE_DESCRIPTION AS highest_grade 
  FROM BBOP.EP_MAIN_FACT a 
       LEFT JOIN BBOP.EP_CODE_WORK b 
              ON a.HIGHESTGRADE_CA = b.code
             AND code_type LIKE 'High%'
       LEFT JOIN BBOP.EP_CODE_WORK ab 
              ON a.Goal_Steps = ab.code
             AND code_type LIKE 'Goal%'
 WHERE plan_date BETWEEN '01-mar-2019' AND '31-may-2019';

- ORA-00918: столбец неоднозначно определен 00918. 00000 - «столбец неоднозначно определен»

Вот 2 запроса, они дают результаты без проблем.

- Высшая оценка

SELECT a.* 
     , b.CODE_DESCRIPTION AS highest_grade_desc 
  FROM BBOP.EP_MAIN_FACT a 
       LEFT JOIN BBOP.EP_CODE_WORK b 
              ON a.HIGHESTGRADE_CA = b.code
 WHERE plan_date BETWEEN '01-mar-2019' AND '31-may-2019'
   AND code_type LIKE 'High%';

- Цели

SELECT a.* 
     , b.CODE_DESCRIPTION AS Goal 
  FROM BBOP.EP_MAIN_FACT a 
       LEFT JOIN BBOP.EP_CODE_WORK b 
              ON a.Goal_Steps = b.code
 WHERE plan_date BETWEEN '01-mar-2019' AND '31-may-2019'
   AND code_type LIKE 'Goal%';

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Как уже было сказано в комментариях, столбцы plan_date и code_type должны иметь псевдоним таблицы, указанный при их использовании.

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

С уважением Акаша

0 голосов
/ 08 июля 2019

Я думаю, что вы хотите:

select mf.*, coalesce(cwh.CODE_DESCRIPTION, cwg.CODE_DESCRIPTION) as highest_grade 
from BBOP.EP_MAIN_FACT mf left join
     BBOP.EP_CODE_WORK cwh
     on mf.HIGHESTGRADE_CA = cwh.code and
        cwh.code_type like 'High%' left join
     BBOP.EP_CODE_WORK cwg
     on mf.Goal_Steps = cwg.code and
        cwg.code_type like 'Goal%'
where mf.plan_date >= date '2019-03-01' and
      mf.plan_date < date '2019-06-01';

Примечания:

  • В запросе, который ссылается на несколько таблиц, укажите все ссылки на столбцы.Это корень вашей проблемы.В предложениях on имеются «пустые» ссылки на столбцы.
  • Используйте значимые псевдонимы таблиц, а не произвольные буквы.
  • coalesce() выбирает значения на основе порядка приоритетаjoin.
  • Oracle поддерживает ключевое слово date для представления литералов даты.Это безопаснее, чем полагаться на форматы по умолчанию, которые могут измениться на данном сервере.
  • between опасен для дат, особенно в Oracle, где тип date всегда имеет компонент времени.Неравенства захватывают логику.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...