Oracle接続クエリの理解

4207 ワード

Oracleデータベースの左接続と右接続
Oracle PL-SQLでは、左と右を次のように接続します。
次の文を表示します。
SELECT emp_name,dept_name FORM Employee,Department WHERE Employee.emp_deptid(+)=Department.deptid
このSQL文は右に接続されています。つまり、「(+)」の位置の反対側が接続の方向であり、右に接続されている説明のような番号の右側のすべての記録が表示されます。左側でマッチしているかどうか、つまり、上の例ではどの部門にも従業員がいない場合があります。この部門の名前は検索結果に現れます。
逆に:SELECT emp_name,dept_name FORM Employee,Department WHERE Employee.emp_deptid=Department.deptid(+)
左連結です。この従業員がDepartment表にマッチする部署番号があるかどうかにかかわらず、この従業員の記録が表示されます。
oracle接続クエリフィールド(+)  
2010-07-08 16:02:00|  ORACLE関連キーワード  タグ:𞓜号大中小 購読する
話をする前に、例を挙げて紹介します。
内の接続、つまり普通の等しい接続です。プロジェクト     *    from   a,    b
where a.id=b.id;外部接続の場合、oracleでは「(+)」を使用して表現できますが、9 iはleft/right/full outerjunを使用してもいいです。以下では、実例に合わせて説明します。
注意:外部接続中のwhereは外部接続後の結果集です。
1.left outerjin:左外関連
select e.last_name, e.department_id, d.department_name    
from employees e    
left outer join departments d    
on (e.department_id = d.department_id);
に等しい
select e.last_name, e.department_id, d.department_name    
from employees e, departments d    
where e.department_id=d.department_id(+);
その結果、全従業員及び対応部署の記録には、対応部署番号のないdepartment(u)が含まれています。IDの社員記録。つまり従業員が全部展示しています。従業員の所属部門は全部価値があるとは限りません。2.ライトアウトジョイン:右外関連
select e.last_name, e.department_id, d.department_name    
from employees e    
right outer join departments d    
on (e.department_id = d.department_id);
に等しい
select e.last_name, e.department_id, d.department_name    
from employees e, departments d    
where e.department_id(+)=d.department_id;
その結果、全部門の記録には、従業員がいない部門の記録が含まれています。つまり部門が全部展示しています。部門下の従業員は全部価値があるとは限らないです。3.フルアウトジョイン:全外関連
select e.last_name, e.department_id, d.department_name    
from employees e    
full outer join departments d    
on (e.department_id = d.department_id);
その結果、全従業員及び対応部署の記録には、対応部署番号のないdepartment(u)が含まれています。idの従業員記録と従業員記録がない。
left outer jinとright outer junion集です。
外連結とは、2つの表を左に連結した表の全ての値を調べ、右の表の値を空にすることができます。
                                                 右に連結した表は全部値があります。左の表の値は空です(+)                                             
                                                 全接続は左接続と右接続のセットです。 ユニオン                                 
                                                 内部接続は左接続と右接続のインターリーブです。
残りの接続方法:
クロスリンク、検出されたテーブルのデカルト積
eg:select*from A cross join B    (A表はM行、B表はN行、結果はM*N行)です。
左に接続
             a.id=b.id(+)=>a表の内容は全部表示されています。左側の表を基準としています。
              left join:left join左の表を全部表示して、左の表を基準とします。
              select*from emp e left join dept d on e.deptno=d.deptno;
右接続    a.id(+)=b.id=>b表の内容はすべて表示され、右の表を基準とします。
              right join:right join右の表が全部表示されています。右の表を基準にしてください。
             select*from emp e right jun dept d on.deptno=d.deptno;
right join、left joinにはwhere from文などがありません。
自然接続:ネイルジョイン
           自然接続、natual joinは列名によって自動的に接続を作成し、on文を省略して、デカルト積の出現を避ける。
   eg:select empno,ename,sal,deptno,loc
from emp
natual jun
dept;
つまり、empとdeptテーブルには、同じ名前の列の対応値がリンクされています。  の意味は同じです。違いはナチュルジョンがあります。
書きません  =  ;
using:指定された列に関連することを表します。
eg:select e.ename,e.sal,deptno,d.loc
from emp e
ジョンdept d
using(deptno)
where deptno=20
注:using子文で引用された列は、sql文のどこにも表名または別名をプレフィックスとして使用できません。
PS:外部接続をする時は、where条件にリストの条件を加えてはいけません。表からサブクエリをして、別の表を作成してください。
eg:selectt.acctype,nvl(b.name,t.acctype)as name      from biacciccadmaptb、dictcodesettb      where b.category='口座タイプ'        andt.acctype=b.com(+)        and t.iccardno='100075109001385'  
this is wrong
ショルダー:
select t.t.acctype,nvl(b.name,t.acctype)as name from biacccadmaptb t,(select*from dictcodesettb)b where category='アカウントタイプ')b where    t.acctype=b.com(+)   and t.iccardno='100075109001385'