Возможна ошибка Oracle при выборе с ПОЛНЫМ ВНЕШНИМ СОЕДИНЕНИЕМ

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

FROM user01.myTable ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ user01.myTable myTable_alias2

SELECT      
            myTable.field1 AS field1,
            myTable.date_hour AS date_hour,
            myTable.HOUR,
            DECODE (
                    myTable.aux1, 'CAT', 'CAT3', myTable.aux1
                    ) AS aux1,
            myTable.sum_count,
            myTable_alias2.sum_count AS sum_countx,
            myTable.aux2,
            myTable_alias2.aux2 AS aux2x
   FROM user01.myTable FULL OUTER JOIN user01.myTable myTable_alias2
            ON (myTable.field1 = myTable_alias2.field1
                  AND myTable.HOUR = myTable_alias2.HOUR
                  AND myTable.aux1 = myTable_alias2.aux1
                  AND TO_CHAR (TO_DATE (myTable.date_hour, 'YYYYMMDD') - 7,'YYYYMMDD') = myTable_alias2.date_hour
             )

В моей системе есть user01.myTable, но в моей системе нет myTable_alias2. и если я заменю все myTable_alias2 на myTable_aliasXXX, выбор будет работать правильно!

я не понимаю, я думаю, что myTable_alias2 похож на копию user01.myTable, но если это правильно, я могу написать все так:

SELECT         
            myTable.field1 AS field1,
            myTable.date_hour AS date_hour,
            myTable.HOUR,
            DECODE (myTable.aux1, 'CAT01L0', 'CAT01L03', myTable.aux1) AS aux1,
            myTable.sum_count,
        myTable.aux2
FROM user01.myTable 

в чем я не прав? что я не понимаю? это особое полное внешнее соединение или простая ошибка? Большое спасибо за ваше время!


person BellaVita    schedule 14.03.2012    source источник


Ответы (2)


я думаю, что myTable_alias2 похож на копию user01.myTable

Это верно. На самом деле таблица не копируется, но запрос работает так, как если бы у вас было 2 копии таблицы, и вторая копия получает другое имя (псевдоним), поэтому она отличается от первой.

но тогда я могу написать все так: ...

Нет, ваша переписка не эквивалентна первой (FULL JOIN) версии. Объединение не выполняется полностью в одних и тех же столбцах.

Эта часть:

   TO_CHAR (TO_DATE (myTable.date_hour, 'YYYYMMDD') - 7,'YYYYMMDD') 
   = myTable_alias2.date_hour

означает, что строки из первой копии таблицы будут сопоставлены с другими строками из второй копии.

person ypercubeᵀᴹ    schedule 14.03.2012

Это не уникально для полных внешних соединений. Каждый раз, когда вы объединяете таблицы, рекомендуется использовать псевдонимы для имен таблиц и использовать эти псевдонимы для уточнения имен столбцов. Если вы выполняете самосоединение, когда вы соединяете таблицу с самой собой, необходимо создать псевдоним хотя бы для одного из двух экземпляров таблицы.

Если у меня есть стандартные SCOTT таблицы EMP и DEPT, например, я могу написать запрос без псевдонимов

SELECT emp.ename,
       dept.dname
  FROM emp 
       JOIN dept ON (emp.deptno = dept.deptno)

или я пишу запрос с псевдонимами

SELECT e.ename,
       d.dname
  FROM emp e
       JOIN dept d ON (e.deptno = d.deptno)

В последнем случае E и D не являются объектами в базе данных. Это просто сокращение для таблиц, которые они называют псевдонимами, EMP и DEPT, которые доступны в рамках запроса.

Если я хочу присоединить таблицу к самой себе, скажем, мне нужен отчет о сотрудниках и их руководителях, я могу написать самообъединение.

SELECT employee.ename,
       manager.ename
  FROM emp employee
       JOIN emp manager ON (employee.mgr = manager.empno)

В этом случае я присоединяю таблицу EMP к самой себе, а псевдонимы помогают определить, какой набор данных представлен каждым экземпляром таблицы EMP. Один экземпляр предоставляет информацию о сотруднике, а другой экземпляр предоставляет информацию о менеджере.

person Justin Cave    schedule 14.03.2012