隨筆-295  評論-26  文章-1  trackbacks-0
          select S_10994_1_SYS_MODELTYPE.nextval,a.typeid,'SYS','Mail_Forward','郵件轉發模板','Mail Forward Model' from
          bse_organization a where not exists (select orgtypeid from SYS_MODELTYPE b where b.orgtypeid=a.typeid and modelcode ='Mail_Forward')
          --

          select S_10994_1_SYS_MODELTYPE.nextval,typeid,'SYS','Mail_Forward','郵件轉發模板','Mail Forward Model' from
          bse_organization where typeid not in (
          select orgtypeid from SYS_MODELTYPE where modelcode='Mail_Forward'
          )

          請注意not in 邏輯上不完全等同于not exists,如果你誤用了not in,小心你的程序存在致命的BUG:


          請看下面的例子:
          create table t1 (c1 number,c2 number);
          create table t2 (c1 number,c2 number);

          insert into t1 values (1,2);
          insert into t1 values (1,3);
          insert into t2 values (1,2);
          insert into t2 values (1,null);

          select * from t1 where c2 not in (select c2 from t2);
          no rows found
          select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2);
          c1 c2
          1 3

          正如所看到的,not in 出現了不期望的結果集,存在邏輯錯誤。如果看一下上述兩個select語句的執行計劃,也會不同。后者使用了hash_aj。
          因此,請盡量不要使用not in(它會調用子查詢),而盡量使用not exists(它會調用關聯子查詢)。如果子查詢中返回的任意一條記錄含有空值,則查詢將不返回任何記錄,正如上面例子所示。
          除非子查詢字段有非空限制,這時可以使用not in ,并且也可以通過提示讓它使用hasg_aj或merge_aj連接。



          大盤預測 國富論
          posted on 2007-10-11 16:51 華夢行 閱讀(188) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 平和县| 永年县| 永兴县| 龙里县| 仁化县| 申扎县| 蕲春县| 北票市| 康乐县| 阿巴嘎旗| 延长县| 商都县| 民权县| 陵川县| 东山县| 修文县| 改则县| 榆树市| 浦江县| 沂水县| 桐庐县| 福鼎市| 祁东县| 双流县| 合川市| 兴山县| 青田县| 福鼎市| 神池县| 申扎县| 兴文县| 萝北县| 麻阳| 米易县| 扬州市| 永登县| 平遥县| 利津县| 衡阳市| 墨竹工卡县| 淮滨县|