CREATE TABLE balance_sheet (
bs_id INTEGER PRIMARY KEY, -- 節點代碼
bs_pid INTEGER, -- 父節點代碼
bs_name VARCHAR2(100), -- 專案名稱
bs_value NUMBER(10), -- 金額
bs_dir NUMBER(1) DEFAULT 1 -- 彙總方向:1=加, -1=減
);
SELECT bs_name, bs_value
FROM balance_sheet
CONNECT BY PRIOR bs_id = bs_pid
START WITH bs_pid = 0; -- 根節點父代碼為 0
SELECT
CASE WHEN level = 1 THEN ' ' || bs_name
WHEN level = 2 THEN ' ' || bs_name
END AS bs_name,
bs_value
FROM balance_sheet
CONNECT BY PRIOR bs_id = bs_pid
START WITH bs_pid = 0;
SELECT ...
FROM balance_sheet
CONNECT BY PRIOR bs_id = bs_pid
START WITH bs_id IN (1,7) -- 流動資產、長期資產
ORDER SIBLINGS BY bs_value DESC;
SELECT LTRIM(SYS_CONNECT_BY_PATH(bs_name, '|'), '|') AS path,
bs_name, bs_value
FROM balance_sheet
CONNECT BY PRIOR bs_id = bs_pid
START WITH bs_pid = 0;
SELECT SUBSTR(path, 1, INSTR(path, '|', -1, 1)-1) AS parent_path,
SUM(bs_value * bs_dir) AS calculated_value
FROM (
SELECT bs_id, bs_pid,
LTRIM(SYS_CONNECT_BY_PATH(bs_name, '|'), '|') AS path,
bs_value, bs_dir
FROM balance_sheet
CONNECT BY PRIOR bs_id = bs_pid
START WITH bs_pid = 0
)
GROUP BY SUBSTR(path, 1, INSTR(path, '|', -1, 1)-1);
彙總計算結果顯示原表「流動資產」金額有誤 (應為 4356.45 而非 4256.45),證明階層查詢可作為財務報表自動核對工具。
bs_lid (邏輯層級)、bs_lpid (邏輯父節點) 區分「顯示層次」與「計算邏輯」bs_op 欄位