<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    一段很繞的SQL(雙重否定)
    ?
    ??? 前段時間看到一段SQL,感覺實現的邏輯非常繞,而且看了之后想了很久都沒有想明白到底是怎么回事,再一直想到我都能記住這段SQL的具體細節了,放到博客上研究一下。以下模擬環境:
    ?
    create table t1 (a int,b int);
    insert into t1 values(1,1);
    insert into t1 values(1,2);
    insert into t1 values(1,3);
    insert into t1 values(2,2);
    insert into t1 values(2,3);
    insert into t1 values(4,1);
    insert into t1 values(4,2);
    insert into t1 values(4,3);
    insert into t1 values(5,1);
    insert into t1 values(5,6);
    insert into t1 values(6,1);
    commit;
    ?
    SQL> select * from t1;
    ?
    ??? A???? B
    ----- -----
    ??? 1???? 1
    ??? 1???? 2
    ??? 1???? 3
    ??? 2???? 2
    ??? 2???? 3
    ??? 4???? 1
    ??? 4???? 2
    ??? 4???? 3
    ??? 5???? 1
    ??? 5???? 6
    ??? 6???? 1
    11 rows selected
    ?
    ?
    ??? 問題是這樣的:t1表中A代表人員編號,B代表事件編號。要求出t1表中所有包含人員2所對應的事件的人員編號。
    ??? 它給出的答案是這樣的:
    ?
    select distinct a
    ? from t1 a
    where not exists (select 1
    ????????? from t1 b
    ???????? where a = '2'
    ?????????? and not exists (select 1
    ????????????????? from t1 c
    ???????????????? where c.a = a.a
    ?????????????????? and c.b = b.b));
    ?
    ?
    ??? 首先可以確定的是結果肯定是正確的。然后來看一下邏輯:這段SQL中用了兩層not exists,是用雙重否定來取出最終結果的,但是具體的邏輯始終沒有看明白,到網上搜索了一下,發現遇到這個問題的人還挺多,找了個比較能夠看懂的解答看了下,總算明白了點:
    ?
    http://zhidao.baidu.com/question/47772985.html
    ?
    ?
    ?
    ?
    ??? 關于這道題目可能需要這樣來理解:
    ?
    ??? 1、先看最內層
    ?
    ??? select *
    ????? from t1 b
    ???? where a = '2'
    ?????? and not exists (select 1 from t1 c where c.b = b.b)
    ?
    ??? 這個代表人員2對應的事件中,沒有任何人對應的集合,很顯然是一個空集,因為即便沒有任何人對應,也有人員2自己對應。但是如果在c中加一個人員號的限定條件就不一定存在值了。
    ?
    ??? 2、在最內層中加上a限定
    ?
    ??? select *
    ????? from t1 b
    ???? where a = '2'
    ?????? and not exists (select 1
    ????????????? from t1 c
    ???????????? where c.a = &a
    ?????????????? and c.b = b.b)

    ??? 這就表示人員&a對應的事件中,沒有和人員2對應事件相同的事件集合。所以只要在這個查詢中沒有值的,即表示這個人員對應的事件包含了所有人員2對應的事件。如果有值則表示人員2對應的事件有1件或1件以上是該人員所沒有的。
    ?
    ??? 3、最外層就比較明顯了
    ?
    ??? select distinct a
    ????? from t1 a
    ???? where not exists (select 1
    ????????????? from t1 b
    ???????????? where a = '2'
    ?????????????? and not exists (select 1
    ????????????????????? from t1 c
    ???????????????????? where c.a = a.a
    ?????????????????????? and c.b = b.b))
    ??? 用最外層的a.a代替了&a,即把所有人員都進行比對,凡事在下面不存在值的(剛才判斷過了,不存在值即包含了2對應的所有事件),即需要獲取的人員信息。
    ???
    ?
    posted on 2009-06-12 21:36 decode360 閱讀(2632) 評論(0)  編輯  收藏 所屬分類: 05.SQL
    主站蜘蛛池模板: 亚洲色偷偷色噜噜狠狠99| 亚洲午夜精品一区二区麻豆| 巨胸喷奶水视频www免费视频| 国产免费牲交视频| 国产精品久久亚洲一区二区| 四虎永久免费网站免费观看| 无遮挡a级毛片免费看| 国产黄色一级毛片亚洲黄片大全| 九一在线完整视频免费观看| 亚洲伊人成无码综合网 | 亚洲乱码日产精品a级毛片久久| 国产综合激情在线亚洲第一页| mm1313亚洲精品国产| eeuss影院免费92242部| 久久久久亚洲AV成人无码网站| 99xxoo视频在线永久免费观看| 亚洲av永久无码精品三区在线4| 成年大片免费视频| 色一情一乱一伦一视频免费看| 爱情岛论坛网亚洲品质自拍| 免费国产成人午夜在线观看| 亚洲字幕在线观看| 国产精品自在自线免费观看| a级毛片免费网站| 67pao强力打造67194在线午夜亚洲| 麻豆国产精品免费视频| 99亚洲男女激情在线观看| 久久99亚洲综合精品首页| 伊人久久免费视频| 中中文字幕亚洲无线码| 亚洲综合国产精品第一页| 久久久精品2019免费观看| 在线亚洲v日韩v| 国产亚洲精品一品区99热| 猫咪社区免费资源在线观看 | 中文字幕乱码免费看电影| 亚洲美女aⅴ久久久91| 国产成人免费全部网站 | a级毛片在线免费观看| 激情综合亚洲色婷婷五月| 国产午夜亚洲精品理论片不卡|