簡體   English   中英

如何在Oracle SQL LEVEL查詢中將原始“開始於”ID作為列捕獲

[英]How to Capture Original “Start With” ID as a Column in Oracle SQL LEVEL Query

使用大型材料數據庫作為“輸入”消耗,以創建多代的各種“輸出”。 最終產出(市場產品)在其歷史上可能有十幾代投入。 這些輸入中的每一個都有自己的記錄。

目前,我正在使用LEVEL創建這個系譜的自上而下的視圖(意味着從最終產品開始並通過所有輸入回溯)。

代碼的簡化/概念示例如下:

SELECT
 OL.LOT_NAME AS output_id,
 IL.LOT_NAME AS input_id,
 LEVEL
FROM GENEALOGY_TABLE G
INNER JOIN LOT_TABLE OL
 on G.OUTPUT_LOT_KEY = OL.LOT_KEY
INNER JOIN LOT_TABLE IL
 on G.INPUT_LOT_KEY = IL.LOT_KEY
START WITH OL.LOT_NAME IN ('X', 'Y', etc...)
CONNECT BY NOCYCLE PRIOR IL.LOT_NAME = OL.LOT_NAME
ORDER BY LEVEL

我希望在此輸出表中添加另一列,其中包含原始“START WITH”值,該值是任何給定記錄的原點。 意思是即使記錄的級別為10,我也不會只看到該材料創建的9級輸出,而是多個最終產品中的哪一個('X','Y'等...在上面例子)最終在下游創建。

Oracle是否有能夠處理此問題的功能? 有一個簡單的伎倆,我錯過了嗎? 任何建議都會很精彩。

您可以使用connect_by_root運算符

SELECT
 OL.LOT_NAME AS output_id,
 IL.LOT_NAME AS input_id,
 LEVEL,
 CONNECT_BY_ROOT(OL.LOT_NAME) AS STARTED_WITH
FROM GENEALOGY_TABLE G
...

使用HR模式表的快速演示:

SELECT employee_id, last_name, manager_id, connect_by_root(manager_id)
FROM employees
START WITH manager_id in (101, 102)
CONNECT BY PRIOR employee_id = manager_id;

EMPLOYEE_ID LAST_NAME                 MANAGER_ID CONNECT_BY_ROOT(MANAGER_ID)
----------- ------------------------- ---------- ---------------------------
        108 Greenberg                        101                         101
        109 Faviet                           108                         101
        110 Chen                             108                         101
        111 Sciarra                          108                         101
        112 Urman                            108                         101
        113 Popp                             108                         101
        200 Whalen                           101                         101
        203 Mavris                           101                         101
        204 Baer                             101                         101
        205 Higgins                          101                         101
        206 Gietz                            205                         101
        103 Hunold                           102                         102
        104 Ernst                            103                         102
        105 Austin                           103                         102
        106 Pataballa                        103                         102
        107 Lorentz                          103                         102

16 rows selected. 

使用Oracle總有一種方法。 使用CONNECT_BY_ROOT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM