مقايسه (Oracle Syntax(CONVENTIONAL با ANSI/ISO Syntax
.سال 1991 استاندارد شد ANSI/ISO SQL
در جاهاي مختلفي بيان كردند كه اوراكل پيشنهاد مي دهد كه از ANSI SQL استفاده نماييد اين كاملا صحيح است ولي در خود شركت اوراكل در قسمت هاي مختلف از روش موجود (Existing Syntax) كه هست نيز استفاده مي كنند.
از لحاظ كارايي و Performance يكسان مي باشد.
هر كدام از نوع Syntaxها در بعضي از حالات گويا و راحتر مي باشد.
علامت (+) Outer joins در دستور اوراكل استفاده مي شود.
اين امكان وجود دارد كه در هر نسخه از اوراكل يا انواع كانكشن هايي كه با ديتابيس اوراكل اتصال برقرار مي كند در بعضي از دو روش به خطا برخورد كنيد كه مسلما براي آنها Patch هايي توسط خود اوراكل ايجاد مي گردد.
حال استفاده از هر روش بصورت سليقه اي مي باشد.
براي بيان كردن مطلب، آنها را با مثال هاي ساده با هر دو روش نشان مي دهم.
**CROSS JOIN**
ANSI/ISO Syntax:
SELECT e.ename,
d.dname
FROM emp e
CROSS JOIN dept d
Existing Syntax:
SELECT e.ename,
d.dname
FROM emp e, dept d
**NATURAL JOIN**
ANSI/ISO Syntax:
فيلدهاي همنام رو براي پيوستن دو جدول با هم ، برابر هم قرار مي دهد. مجاز به استفاده از فيلدهاي وابستگي جداول در شرط نمي باشيد
SELECT e.ename,
d.dname
FROM emp e
NATURAL JOIN dept d
Existing Syntax:
معادل اين دستور وجود ندارد
**[INNER] JOIN … USING**
ANSI/ISO Syntax:
مجاز به استفاده از فيلدهاي وابستگي جداول در شرط نمي باشيد
SELECT e.ename,
d.dname
FROM emp e
JOIN dept d USING (deptno)
Existing Syntax:
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE e.DEPTNO = d.DEPTNO
**[INNER] JOIN … ON**
ANSI/ISO Syntax:
SELECT e.ename,
d.dname
FROM emp e
JOIN dept d ON e.deptno = d. deptno
Existing Syntax:
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE e.DEPTNO = d.DEPTNO
**Multiple joins**
ANSI/ISO Syntax:
SELECT e.ename,
d.dname
FROM emp e
JOIN dept d ON e.deptno = d. deptno
JOIN course c ON c.idcode = d. idcode
Existing Syntax:
SELECT e.ename,
d.dname
FROM emp e, dept d, course c
WHERE e.DEPTNO = d.DEPTNO
AND c.idcode = d.idcode
**{LEFT} [OUTER] JOIN**
ANSI/ISO Syntax:
SELECT e.ename,
d.dname
FROM dept d
LEFT OUTER JOIN emp e ON d.deptno = e. deptno
Existing Syntax:
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE d.DEPTNO(+) = e.DEPTNO
**{RIGHT} [OUTER] JOIN**
ANSI/ISO Syntax:
SELECT e.ename,
d.dname
FROM emp e
RIGHT OUTER JOIN dept d ON e.deptno = d. deptno
Existing Syntax:
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE d.DEPTNO = e.DEPTNO(+)
**{FULL} [OUTER] JOIN**
ANSI/ISO Syntax:
SELECT e.ename,
d.dname
FROM emp e
FULL OUTER JOIN dept d ON e.deptno = d. deptno
Existing Syntax:
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE e.DEPTNO = d.DEPTNO(+)
UNION ALL
SELECT e.ename,
d.dname
FROM emp e, dept d
WHERE d.DEPTNO = e.DEPTNO(+)
AND e.ENAME IS NULL
من خودم به شخصه از Oracle Sql استفاده می کنم. و خیلی وقت هست که قصد دارم در کارهایم از ANSI SQL نیز استفاده کنم. ولی خوب با اون روش عادت کردم . کمی سخت هست ولی به شخصه پیشنهاد می کنم که هر دو روش را باهم استفاده کنید. حال اوراکل یکی از دلایل اینکه پیشنهاد و توصیه می کند بخاطر استاندارد بودن ANSI SQL می باشد. نیز دلایل دیگری هست که نقل قول افراد حرفه ای و انجمن های بزرگی مانند Toad World می باشد که در زیر آنها را آورده ام. فقط به فارسی نگفتم چون کاملا واضح هستند.
- Some problems cannot be answered/coded unless you use an ANSI JOIN.
- Some things in ANSI JOIN are far superior to the non-ANSI alternative. FULL OUTTER JOIN, for example, requires two queries and UNION.
- Once you get used to ANSI JOIN, the code is far easier to read, especially for long or complex queries.
- Portable syntax will work on all other ANSI compliant databases, such as MS SQL Server, DB2, MySQL, PostgreSQL, et al
- Since it’s the universally accepted standard, it’s the general target for all future database and third party vendors’ tools
- The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.
- A condition containing the (+) operator cannot be combined with another condition using the OR logical operator
- A condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.
- A condition cannot compare any column marked with the (+) operator with a sub-query
حال به نکات بالا توجه کنید. چندین محدودیت در استفاده از (+) وجود دارد
در نتیجه:
it’s time to embrace the ANSI join syntax – and move into the 21st century
اميدوار هستم به دوستان كمك كرده باشد.