Postgresql
在 CTE 或嵌套查詢中對每一行執行 SELECT?
這是PostgreSQL中的一個問題
我有一個儲存使用者樹的表;
+------+---------+ | 編號 | 家長 | |------+---------| | 1 | 0 | |------|---------| | 2 | 1 | |------|---------| | 3 | 1 | |------|---------| | 4 | 2 | |------|---------| | 5 | 2 | |------|---------| | 6 | 4 | |------|---------| | 7 | 6 | |------|---------| | 8 | 6 | +------+---------+
我可以使用 tablefunc 擴展中的函式從任何節點查詢完整的樹
connectby
,並且我可以根據其中的總節點單獨查詢樹的大小,例如#1 的
樹大小為 7 #5 的
樹大小為 0 #6 的樹大小為 2,依此類推
現在我想做一些事情,比如從這個表中選擇所有可能的樹(再次由 執行
connectby
),計算它的大小並創建另一個數據集,其中包含ID和基礎樹大小的記錄,如下所示:+------------------+-------------+ | 樹根節點 | 樹大小 | |------------------+-------------| | 1 | 7 | |------------------+-------------| | 2 | 3 | |------------------+-------------| | 3 | 0 | |------------------+-------------| | 4 | 3 | |------------------+-------------| | 5 | 0 | |------------------+-------------| | 6 | 2 | |------------------+-------------| | 7 | 0 | |------------------+-------------| | 8 | 0 | +------------------+-------------+
問題是,我無法對原始表中的每個可用行執行相同的 SELECT 語句以獲取樹併計算大小,即使可以,我也不知道如何使用獲取的和計算的數據。
我不確定這是否可以簡單地使用 Postgres 中可用的一些函式,或者我必須為它編寫一個函式,或者只是我不知道這種查詢到底是什麼,但Google搜尋了幾個小時並蒐索了另一個小時在 dba.stackexchange 這邊什麼也沒返回。
有人可以指出正確的方向嗎?
讓我知道這是否有幫助。這是使用 MSSQL (T-SQL) 語法,因此您可能必須針對 postgres 對其進行調整,但是,使用名為 #tree 的臨時表,其中包含兩列 id 和 parent 並按照您的範例填充
SELECT 1, 0 UNION SELECT 2, 1 UNION SELECT 3, 1 UNION SELECT 4, 2 UNION SELECT 5, 2 UNION SELECT 6, 4 UNION SELECT 7, 6 UNION SELECT 8, 6: with cte as ( select id as currentnode, id as root from #tree union all select t.id as currentnode, cte.root from #tree t join cte on t.parent = cte.currentnode ) select * from cte order by root
上述遞歸 CTE 將產生從某個根開始可到達的所有節點。你可以做:
SELECT root, count(*) from cte group by root
count(*) 查詢應該產生,
root | count ---------------- 1 | 8 2 | 6 3 | 1 4 | 4 5 | 1 6 | 3 7 | 1 8 | 1
然後,您可以從每個中減去 1 以獲得您暗示的結果。這是你要找的嗎?即使沒有,我覺得遞歸 CTE 可能可以幫助您滿足您的需求。
在查詢中添加 GROUP BY tree_root_node ???
我可能弄錯了。我不是任何特定於產品的 SQL 的專家,但我希望這是解決您的問題的“正確方向”,一般來說是 SQL。