1. 程式人生 > >寫複雜檢視時需要注意的問題

寫複雜檢視時需要注意的問題

不知道大家寫複雜檢視時有沒有遇到這樣的困境:這個檢視需要關聯十幾張表,但這十幾張表之間不一定有關係(例如,我要寫一張產品銷售金額的檢視,主體表肯定是產品銷售金額表,但是檢視中需要顯示公司英文名,則需要公司資訊基礎表),這個時候你有幾種寫法可以選擇:

1. 把全部表直接列在from後面

select ********
   from 表A,表B.....表N
where .........

這樣寫的好處是簡單,易閱讀,但是這種寫法有個比較大的缺陷就是:一般都要在最後加上group by 字句,而且差不多是select多少欄位就要group by 多少欄位,尤其當資料量比較大的時候,這樣的寫法不僅慢,而且對temp表空間也會有挑戰,因為要進行大量資料的分組操作。所以這種寫法直接被忽視。。

2. 寫子查詢

select company_name,
          (select product_name
             from 表A
          where ****) product_name,
          (select money
             from 表A
          where ****) money,
          ......................
from 表B,表C.......
where ..........
這樣寫的好處是避免不必要的group by 操作,將主體表(產品銷售金額表)與基礎表(公司資訊表)分開,避免表的不必要關聯,也容易閱讀。但是這種寫法會增加對錶的掃描,比如上面的例子,本來product_name,money都是表A上的欄位,本來掃描一次就可以全部讀取出來,但是子查詢是不允許你同時查多列的資料,所以需要對同一個表掃描多次(where條件可能完全一樣)來取出不同欄位的值。這種方法也不是很好。。

3. 構造資料集

select t.product_name,
          t.money,
          ..........
  from (select product_name,
                      money
              from 表A where ......) t,
            表B,表C.....表N
where ........

這樣寫就可以避免了2中的對同一個表掃描多次的問題,將主體表中需要的多個欄位通過select構造成一個數據集。這樣寫的關鍵是把握好哪些表應該放進資料集t中,一般是主體資訊表(需要從該表上獲取多個欄位的值),以及主體資訊表需要輔助關聯的表,把那些跟主體資訊不相關的表都單獨放在外面(例如,公司基本資訊表),這樣寫,也有個缺點,集合t中表不能引用外面的表,這個例子中就是,如果t中表A需要關聯表B,才能把產品金額正確查出來的話,你必須在t中from後面加上表B,不能直接去關聯外面的表B。如果檢視需要表B 的區域欄位值,金額表A也需要關聯表B,你就要考慮,到底是在集合t中直接將表B的區域欄位查出來(這可能會帶來額外的group by操作),還是放在外面(這樣表B就用了2次,集合t中和外面,對錶B的掃描會增多,但是可以避免group by操作),這就需要你根據具體的情況去衡量了。。。

所以,我建議大家寫複雜檢視的時候,還是選擇第三種方法,效果會比較好,雖然閱讀起來有點吃力。。。。。

相關推薦

複雜檢視需要注意的問題

不知道大家寫複雜檢視時有沒有遇到這樣的困境:這個檢視需要關聯十幾張表,但這十幾張表之間不一定有關係(例如,我要寫一張產品銷售金額的檢視,主體表肯定是產品銷售金額表,但是檢視中需要顯示公司英文名,則需要公司資訊基礎表),這個時候你有幾種寫法可以選擇: 1. 把全部表直接列在f

詳解關於Vue2.0路由開啟keep-alive需要注意的地方

Vue2.0 做應用必有的需求就是頁面資料需要做快取,不用每次進入頁面都要把資料重新請求一遍,每次頁面切換都有段等待資料相應時間,這個使用者體驗可想有多麼蛋疼,所以頁面快取是必要的,啥時候需要更新頁面資料呢?可以監聽狀態變化,或者是手動下拉重新整理重新請求資料,醬紫,我想使用者體驗會做的更好。 keep-a

八大基本變數在賦值需要注意的一個原則

java中的變數型別: 1.數值型變數: byte    short    int    long(長度排序) 2.字元型別: char(單個字元)   String(字串) 3.浮點型別: float(單精

QGraphicsItem使用訊號槽需要注意的事項

1. 繼承QGraphicsItem的子類需要首先繼承自QObjectd再繼承QGraphicsItem 2. 在子類標頭檔案方需要新增宣告 Q_OBJECT 3. 需要重新編譯 class MyItem : public QObject, public QGraphicsI

Vue2.0 路由開啟 keep-alive 需要注意的地方

Vue2.0 做應用必有的需求就是頁面資料需要做快取,不用每次進入頁面都要把資料重新請求一遍,每次頁面切換都有段等待資料相應時間,這個使用者體驗可想有多麼蛋疼,所以頁面快取是必要的,啥時候需要更新頁面資料呢?可以監聽狀態變化,或者是手動下拉重新整理重新請求資料,醬紫,我想使用者體驗會做的更

網站內部更新文章需要注意以下要點

1文章的原創性大家都知道,搜尋引擎非常喜歡原創文章。最好花點時間寫些原創文章。一篇原創文章值得十次重印和偽原創,你也可以鍛鍊自己的寫作能力。如果其實不費心做原創最好的假原創或掃書,只是盲目地重印就不能達到一個很好的目的,可能會適得其反。 2.使用關鍵詞更新文章必須是文章文字策劃的重點,並填寫

使用python需要注意的點和坑

最近使用Python的過程中遇到了一些坑,例如用datetime.datetime.now()這個可變物件作為函式的預設引數,模組迴圈依賴等等。 在此記錄一下,方便以後查詢和補充。 避免可變物件作為預設引數 在使用函式的過程中,經常會涉及預設引數。在Python中,當使用可變物件作為預設

專業代實習報告,需要注意什麼

  一般用到實習報告的主要群體是學生,在需要用到代寫實習報告的時候,都是臨近畢業,外出實習的時候。不過根據不同地方,學校要求的不同,在時間方面,也會有調整,主要就是在經歷實習期過後,在這段時間的經歷、感想、收穫的相關記載。對於這段時間的生活有一個大概的描述,一般學校或者單位,都會進行相應的考察。  

Java使用繼承需要注意的二三事

    繼承是實現類複用的重要手段,它能夠有效減少重複程式碼的數量,但同時也帶來一個最大的壞處:破壞封裝。     子類拓展父類時,子類從父類繼承得到了成員變數和方法,如果訪問許可權允許,子類可以直接訪問父類的成員變數和方法,相當於子類可以直接複用父類的成員變數和方法,

Struts【修改】需要注意的點

需要用到彈棧,不然回顯沒有值 <s:action name="clzAction" namespace="/sy" var="clzList"></s:action> <s:push value="result"> <s:for

android應用上架應用市場需要注意的問題

最近公司剛剛開發完兩個app,需要到各個平臺去釋出,我們公司暫時只發布360應用市場和騰訊應用市場,由於之前準備工作不足導致釋出過程中遇到一些問題,今天在這裡整理一下。 1.首先最重要的是軟著登記證書,現在平臺審查嚴格,凡應用釋出必須有各個應用的軟著,360平臺上有兩個上傳

ArcGIS api for javascript 引入包需要注意的問題

這兩天在做圖例顯示的功能。所有演算法都設計好了,但圖例總是顯示不出來,並且還報原始碼錯誤。苦惱了很久。 報錯如下: Cannot read property "query" of null 原因:請求頭中的request和function中的類名的位置沒有一一對應所導致的 解決

vue入門中元件命名需要注意的地方

下面這張圖是從vue官方上擷取的  其實不只是駝峰命名的prop在自定義標籤中需要用等價的短橫線分隔命名,元件自定義的標籤名稱也一樣  還是官網的例子只不過我把元件的名稱改為駝峰式為  blogPost Vue.component('blogP

list、vector使用erase()需要注意的地方——迭代器失效

先說一下兩者的優缺點吧。 list與vector的區別 vector相當於一個數組。     在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定vector大小的儲存。STL內部實現時,首先分配一個非常大的記憶體空間預備進行儲存,即capacituy()函式

js 使用for...in...遍歷物件需要注意的一個問題:遍歷時莫名其妙的多了屬性

前言 最近在做專案時遇到一個小問題:即在使用for…in…遍歷物件的時候,突然發現物件莫名其妙的多了個屬性,這個屬性在宣告的時候是沒有的,後期也沒有為它新增屬性,但是究竟從何而來呢?經過一番除錯之後找到原因,且看如下程式碼: Object

C語言——使用scanf函式需要注意的問題

轉自:http://blog.csdn.NET/wayne92   scanf函式我曾經在這個函式上犯過不少錯誤,也看到別人犯過的錯誤,記下來,提醒自己不要重蹈覆轍了。如果對你有用,那就更好了:)如果你發現文章中有錯誤,歡迎你不吝賜 教。希望和大家一起學習! 曾經錯

Android值資料讀在sd卡需要注意的事項

使用Sdcard注意事項: 1.許可權問題: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 2.硬性編碼問題:通過 Environment可以獲取sdca

C++中派生類重寫基類過載函式需要注意的問題:派生類函式遮蔽基類中同名函式

派生類可以繼承基類中的非私有函式成員,當然也就可以繼承其中非私有的被過載的函式。如下: 【參考程式碼】 class Base { public: void print() { cout << "print() in Base." <<

mysql分庫分表技術選型需要注意的點

首先需要明確的一些概念和問題: 原先:一個庫一張表,即db和table。水平拆分之後:多個庫多張表,即 { db1,db2,db3,… } 和 { table1,table2,table3,… },假設現在有物理機器 { server1,server2,server3,… }

DLL中匯出全域性變數的方法及匯入需要注意的問題

      今天做程式需要匯出DLL中的一個全域性指標,可是匯出後只要一使用就會發生access violation,後來在網上找了找文章,原來是之前匯入方法存在問題,下面把整個DLL匯出匯入全域性函式的方法整理一下,作為記錄。整個文章大部分參考http://www.pcon