Підтримка ANSI стандарту SQL в Oracle 9i

Одна з переваг версії Oracle 9i (v.9.0.1) над попередніми полягає в підтримці ANSI стандарту SQL. Зокрема, Oracle 9i “нарешті” підтримує такі конструкції з’єднань, як
ТаблA INNER|LEFT|RIGHT|FULL JOIN ТаблB ON умова_з’єднання

Виявляється, не все так гладко для спеціалістів, які раніше звикли з такими конструкціями, працюючи з MS SQLServer чи MS Access. Oracle 9i дійсно дозволяє виконувати SELECT-запити типу
SELECT …
FROM tab1 LEFT JOIN tab2 ON tab1.fld1=tab2.fld2
WHERE …;

Якщо спробувати створити перегляд за допомогою команд
CREATE OR REPLACE VIEW vtab12 AS
SELECT …
FROM tab1 LEFT JOIN tab2 ON tab1.fld1=tab2.fld2
WHERE …;

то ці перегляди створюються без проблем. Однак вибірка з такого перегляду
SELECT * FROM vtab12;
може спричинити незрозумілу помилку.

На скільки я зрозумів, оптимізатор Oracle для запитів не завжди грамотно справляється JOIN-ами. Для нього чомусь складною є конструкція типу
SELECT * FROM (
SELECT …
FROM tab1 LEFT JOIN tab2 ON tab1.fld1=tab2.fld2
WHERE …
);

яка фактично є тотожна до попередньої вибірки з перегляду.

Тому, рекомендую і надалі використовувати традиційні для Oracle з’єднання за допомогою частини WHERE
CREATE OR REPLACE VIEW vtab12 AS
SELECT …
FROM tab1, tab2
WHERE tab1.fld1=tab2.fld2(+)
…;

незважаючи на те, що документація Oracle настійливо рекомендує використовувати ANSI стандарт.

Джерело http://pzhe.net/ua/oracle_ansisql.

© Інформаційні технології. Аналітика , Рідна Мережа