Postgresql

在 CTE 或嵌套查詢中對每一行執行 SELECT?

  • July 12, 2013

這是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。

引用自:https://dba.stackexchange.com/questions/36506