FULL OUTER JOIN с двумя подвыборами дает «ORA-00918: столбец неоднозначно определен» - PullRequest
1 голос
/ 06 февраля 2012

оба Subselects работают нормально автономно.

Но я хочу присоединиться к ним вместе, что всегда дает "ORA-00918: столбец двусмысленно определен". Я не понимаю, почему?

Оба субвыбора используют другие имена.

SELECT *
  FROM    (SELECT aods.user_id,
                  aods.firstname,
                  aods.lastname,
                  Aods.DEPARTMENT,
                  cods.jc_name
             FROM    personas aods
                  LEFT JOIN
                     user_jc cods
                  ON aods.user_id = cods.user_id
            WHERE cods.jc_name LIKE '%ADM%') ods
       FULL OUTER JOIN
          (SELECT abl.user_id,
                  abl.firstname,
                  abl.lastname,
                  Abl.DEPARTMENT,
                  bbl.ug_name
             FROM    personas abl
                  LEFT JOIN
                     ru_ug bbl
                  ON abl.user_id = bbl.user_id
            WHERE Bbl.UG_NAME LIKE '%ADM%'
                  AND bbl.rss_name = 'TIR') bl
       ON ods.user_id = bl.user_id

Ответы [ 2 ]

6 голосов
/ 06 февраля 2012

Потому что вы делаете select * наверху.

user_id
firstname
lastname
DEPARTMENT

присутствуют в обоих подзапросах, и с select * он получит два столбца с одинаковыми именами.

Если вы хотите объединить два подзапроса (так, чтобы результирующий набор столбцов был user_id, firstname, lastname, DEPARTMENT, jc_name, ug_name), вы должны выполнить естественное объединение :

SELECT *
  FROM (SELECT aods.user_id, aods.firstname, aods.lastname, aods.department,
               cods.jc_name
          FROM personas aods LEFT JOIN user_jc cods
               ON aods.user_id = cods.user_id
         WHERE cods.jc_name LIKE '%ADM%') ods
       NATURAL JOIN
       (SELECT abl.user_id, abl.firstname, abl.lastname, abl.department,
               bbl.ug_name
          FROM personas abl LEFT JOIN ru_ug bbl ON abl.user_id = bbl.user_id
         WHERE bbl.ug_name LIKE '%ADM%' AND bbl.rss_name = 'TIR') bl

Вместо этого, если вам нужны все разные столбцы, вы должны явно перечислить их:

 SELECT ods.user_id, ods.firstname, ods.lastname, ods.department, ods.jc_name,
        bl.user_id, bl.firstname, bl.lastname, bl.department, bl.ug_name
   FROM (SELECT aods.user_id, aods.firstname, aods.lastname, aods.department,
                cods.jc_name
           FROM personas aods LEFT JOIN user_jc cods
                ON aods.user_id = cods.user_id
          WHERE cods.jc_name LIKE '%ADM%') ods
        FULL OUTER JOIN
        (SELECT abl.user_id, abl.firstname, abl.lastname, abl.department,
                bbl.ug_name
           FROM personas abl LEFT JOIN ru_ug bbl ON abl.user_id = bbl.user_id
          WHERE bbl.ug_name LIKE '%ADM%' AND bbl.rss_name = 'TIR') bl
        ON ods.user_id = bl.user_id

В своем комментарии вы говорите, что хотите использовать nvl() для каждого столбца с внешним соединением. У меня все отлично работает:

SELECT NVL (ods.user_id, bl.user_id), NVL (ods.firstname, bl.firstname),
       NVL (ods.lastname, bl.lastname), NVL (ods.department, bl.department),
       ods.jc_name, bl.ug_name
  FROM (SELECT '1' user_id, 'ods2' firstname, NULL lastname,
               'ods3' department, 'ods4' jc_name
          FROM DUAL) ods
       FULL OUTER JOIN
       (SELECT '1' user_id, NULL firstname, 'bl2' lastname, 'bl3' department,
               'bl4' ug_name
          FROM DUAL) bl ON ods.user_id = bl.user_id

Вы делаете какие-то дополнительные вещи, такие как order by?

0 голосов
/ 06 февраля 2012

Укажите имена столбцов:

SELECT ods.*, bl.*
  FROM    (SELECT aods.user_id,
                  aods.firstname,
                  aods.lastname,
                  Aods.DEPARTMENT,
                  cods.jc_name
             FROM    personas aods
                  LEFT JOIN
                     user_jc cods
                  ON aods.user_id = cods.user_id
            WHERE cods.jc_name LIKE '%ADM%') ods
       FULL OUTER JOIN
          (SELECT abl.user_id,
                  abl.firstname,
                  abl.lastname,
                  Abl.DEPARTMENT,
                  bbl.ug_name
             FROM    personas abl
                  LEFT JOIN
                     ru_ug bbl
                  ON abl.user_id = bbl.user_id
            WHERE Bbl.UG_NAME LIKE '%ADM%'
                  AND bbl.rss_name = 'TIR') bl
       ON ods.user_id = bl.user_id

Возможно, вы хотите UNION следующим образом [или UNION ALL]:

  SELECT aods.user_id,
          aods.firstname,
          aods.lastname,
          Aods.DEPARTMENT,
          cods.jc_name
     FROM    personas aods
          LEFT JOIN
             user_jc cods
          ON aods.user_id = cods.user_id
    WHERE cods.jc_name LIKE '%ADM%' 

UNION ВЫБЕРИТЕ abl.user_id, abl.firstname, abl.lastname, Abl.DEPARTMENT, bbl.ug_name ОТ персоны ЛЕВОЕ СОЕДИНЕНИЕ ru_ug bbl ON abl.user_id = bbl.user_id ГДЕ Bbl.UG_NAME НРАВИТСЯ "% ADM%" AND bbl.rss_name = 'TIR'

...