Oracle возможна ошибка в выборе с FULL OUTER JOIN - PullRequest
0 голосов
/ 14 марта 2012

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

ИЗ 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 

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

Ответы [ 2 ]

1 голос
/ 14 марта 2012

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

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

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

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

Эта часть:

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

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

0 голосов
/ 14 марта 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. Один экземпляр предоставляет информацию о сотруднике, а другой - информацию о сотруднике.

...