postgreSQL 使用With字句的例子

2021-07-03 08:14:55 字數 1462 閱讀 5753

經常在sql中會遇到比較複雜的sql,很多老手也不知道怎麼入手。在postgres資料庫中有一種強大的with用法,可以分拆複雜的sql並重新組裝,也可以當做臨時表來使用,之前也曾用with語法來實現sql層面的遞迴。以下介紹開發中遇到的另乙個例子。 

環境: postgres 9.1.2 

使用者表t2(user_id) 

場景:開發的sql: 

1.檢視表t1,並排序

2.與表t2關聯

select * from t2 where user_id in(

select user_id from t1 group by user_id order by count(1) desc limit 5);

但是展示的t2結果雖然取出來了,但並沒有排序,沒有達到效果 

解決辦法:

1.使用兩個表的join來實現

select t2.user_id,t2.user_name,count(1) as num from t1,t2 

where t1.user_id = t2.user_id

group by t2.user_id,t2.user_name

order by num desc limit 5;

2.用with來構造:
with tmp as(

select user_id,count(1) as num from t1 group by user_id order by num desc limit 5

)select t2.*,tmp.num from t2 inner join tmp

on t2.user_id = tmp.user_id order by tmp.num desc

分析:

第一種辦法需要兩張表關聯再分組取前5條,執行計畫如下:

如果資料量比較大,尤其是t2表很大的時候,會消耗比較多的資源,另外如果想取使用者表裡有其他的字段,也需要進行分組

第二種辦法是採用with來構造臨時表,然後再去與t2表關聯取數,執行計畫如下: 

可以看到消耗的資源相對少一點,測試中發現t2、t1表很大的時候,這種差距尤其明顯。

OpenCV在Windows下編譯WITH Qt

1.安裝好qt和qtcreator 2.解壓opencv原始碼到乙個目錄下。路徑不能帶空格和中文。3.把e qt qtcreator 2.1.0 mingw bin新增到系統環境變數中。4.安裝cmake gui,執行。設定好opencv原始碼路徑和目標路徑。點configure,選擇mingw m...

為何使用 PostgreSQL

五年以前,我寫了乙個 為何你應使用postgresql 的岾子,引起了廣泛的關注。一年以後,我增加了一些我漏寫的內容,這些內容我會在這篇文章的後半部分重述一下要點。但是在最近的4 5年,postgresql有了很多的改進和提高,也就有了更多的理由我們為何要使用它。現在這裡是乙個新的總結,為何你應使用...

PostgreSQL使用zhparser自定義分詞

zhparser是pg的乙個中文全文檢索外掛程式,它基於簡單中文分詞 scws 實現中文解析器。我們在使用zhparser時常常會遇到的乙個問題就是 我們想要分詞的詞語無法被識別。例如 bill select from ts parse zhparser 支付寶使用很方便 tokid token 1...