У нас есть Oracle 10g, и большинство наших приложений работают под управлением Oracle Forms 6i. Я обнаружил, что все запросы, написанные в представлениях/пакетах/процедурах/функциях, являются таблицами JOINING на уровне предложения WHERE. Пример
SELECT * FROM
TABLE_A A,
TABLE_B B,
TABLE_C C,
TABLE_D D
WHERE
A.ID=B.ID(+)
AND B.NO=C.NO(+)
AND C.STATUS=D.ID
AND C.STATUS NOT LIKE 'PENDING%'
Этот запрос применим только к ORACLE, так как он имеет квалификатор соединения (+)
, неприемлемый для других платформ SQL. Приведенный выше запрос эквивалентен:
SELECT * FROM
TABLE_A A LEFT JOIN TABLE_B B ON A.ID=B.ID
LEFT JOIN TABLE_C C ON B.NO=C.NO
JOIN TABLE_D D ON C.STATUS=D.ID
WHERE
C.STATUS NOT LIKE 'PENDING%'
Ни один из запросов, которые я видел, не написан с соединением, происходящим в предложении FROM.
Мой вопрос можно разделить на три части:
В: Если предположить, что у меня такая же среда Oracle, какой запрос лучше с точки зрения производительности, кеша, загрузки ЦП и т. д. Первый (присоединение в WHERE) или второй (присоединение в FROM)
В: Существует ли какая-либо другая реализация SQL, которая принимает квалификатор соединения (+)
, кроме oracle? если да, то какие?
В: Возможно, запись соединения в предложении WHERE делает запрос более читаемым, но ставит под угрозу возможность соединения ВЛЕВО/ВПРАВО, поэтому (+)
было для. Где можно подробнее прочитать о происхождении этого (+)
и почему он был придуман именно для Oracle?