Странное поведение полного внешнего соединения в Oracle - как это можно объяснить?

Я заметил странное поведение FULL OUTER JOIN в Oracle 11. Я соединял таблицы из схемы HR, в частности, EMPLOYEES и DEPARTMENTS.

Например, следующий запрос возвращает 123 строки:

    SELECT * FROM employees e
    FULL JOIN departments d ON e.department_id = d.department_id

Однако, что сложно понять — когда я добавляю набор определенных столбцов в предложение select, запрос возвращает 122 строки (отсутствующая строка предназначена для сотрудник, которому не назначен отдел - тот, который дополнительно возвращается с левым соединением по сравнению с внутренним соединением):

    SELECT first_name, last_name, department_name FROM employees e
    FULL JOIN departments d on e.department_id = d.department_id

Даже когда я подсчитываю строки, он возвращает 122 ( COUNT(*))!!! ЧТО ЗДЕСЬ ПРОИСХОДИТ? В чем разница между SELECT *и SELECT COUNT(*)?

План объяснения для SELECT * ... :

SELECT STATEMENT                                      122
  VIEW                 VW_FOJ_0                       122
    HASH JOIN                          FULL OUTER     122
      Access Predicates
        E.DEPARTMENT_ID = D.DEPARTMENT_ID
      TABLE ACCESS     DEPARTMENTS     FULL            27
      TABLE ACCESS     EMPLOYEES       FULL           107

и для SELECT COUNT(*) ... :

SELECT STATEMENT                                             1
  SORT                                     AGGREGATE         1
    VIEW               VW_FOJ_0                            122
      HASH JOIN                            FULL OUTER      122
        Access Predicates
          E.DEPARTMENT_ID = D.DEPARTMENT_ID
        INDEX          DEPT_ID_PK          FAST FULL SCAN   27
        INDEX          EMP_DEPARTMENT_IX   FAST FULL SCAN  107
9
задан Florin Ghita 15 March 2012 в 02:09
поделиться