我有下表。
我想選擇 Group-D 的所有成員
SELECT * FROM mytable
where grp = "Group-D"
但是,Group-D 還包含 Group-C 以及用戶 5。Group-C 包含 Group-A 和 Group-B。
所以,選擇應該回傳:
User-1
User-2
User-3
User-4
User-5
Group-A
Group-B
Group-C
顯然,如果不對自身進行多次查找,我將不會得到該輸出。
我怎樣才能讓 select 陳述句像這樣在自身內部進行表查找?
| grp | 成員 |
|---|---|
| A組 | 用戶 1 |
| A組 | 用戶 2 |
| B組 | 用戶 3 |
| B組 | 用戶 4 |
| C組 | A組 |
| C組 | B組 |
| D組 | C組 |
| D組 | 用戶 5 |
| E組 | 用戶 6 |
uj5u.com熱心網友回復:
以下遞回 CTE將遍歷資料以達到父/子關系:
declare @value as varchar(40)
set @value = 'Group-D'
;with CTE as (
select 1 as lvl, @value as member, cast(null as varchar(40)) as parent
union all
select CTE.lvl 1, t.member, t.grp
from CTE
inner join mytable as t on CTE.member = t.grp
where lvl < 10
)
select
lvl, member, parent
from CTE
order by lvl, member
結果
----- --------- ---------
| lvl | member | parent |
----- --------- ---------
| 1 | Group-D | |
| 2 | Group-C | Group-D |
| 2 | User-5 | Group-D |
| 3 | Group-A | Group-C |
| 3 | Group-B | Group-C |
| 4 | User-1 | Group-A |
| 4 | User-2 | Group-A |
| 4 | User-3 | Group-B |
| 4 | User-4 | Group-B |
----- --------- ---------
在db<>fiddle看到這個作業
請注意,我引入了“lvl”作為實作遞回“轉義”的一種方式——“以防萬一”
此外,如果您不想在結果中包含頂級專案,請使用
select
lvl, member, parent
from CTE
where parent IS NOT NULL
order by lvl, member
你可以在 CTE 中以 0 而不是 1 開始 lvl
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/495814.html
下一篇:SELECTb.[count]FROMbWHEREb.timestamp>a.timestamp對于每個唯一值?
