Oracle Левое внешнее соединение

SELECT
    a,
    last_note_user,
    c,
    d,
    iso_src
FROM
    X
    CROSS JOIN Y
    CROSS JOIN Z
    LEFT OUTER JOIN W
        ON W.last_note_user = Z.userid
           AND W.user_ten = Y.iso_src

Приведенный выше код ANSI извлекает мне 107 записей. Когда я даю тот же запрос без кода ANSI, он извлекает 875 записей. Запрос, отличный от ANSI, приведен ниже:

SELECT
    a,
    last_note_user,
    c,
    d,
    iso_src
FROM
    X,
    Y,
    Z,
    W
WHERE
    W.last_note_user = Z.userid(+)
    AND W.user_ten = Y.iso_src(+)

почему есть разница в двух запросах со стандартами ANSI и без стандартов ANSI?? Ответив на вышеуказанный запрос, пожалуйста, помогите мне!!!


person Community    schedule 24.07.2009    source источник


Ответы (2)


В вашем запросе в старом стиле символы (+) находятся не на той стороне предиката. Должен быть:

SELECT
    a,
    last_note_user,
    c,
    d,
    iso_src
FROM
    X,
    Y,
    Z,
    W
WHERE
    W.last_note_user (+) = Z.userid
    AND W.user_ten (+) = Y.iso_src

Но я бы больше не использовал синтаксис старого стиля.

person Tony Andrews    schedule 24.07.2009

OUTER JOINS со старым ANSI-синтаксисом неоднозначны, так что кто знает, что с этим понимает оптимизатор запросов.

Если первый SQL выдает правильные строки, забудьте о версии ANSI и двигайтесь дальше.

person Lasse V. Karlsen    schedule 24.07.2009
comment
Первый SQL — это ANSI, и он правильный. Как указал Тони, в версии для Oracle знаки (+) находятся не на той стороне условия, что и вызывает разницу. - person Dave Costa; 24.07.2009