![](/img/trans.png)
[英]Oracle SQL use a column as a query and then display the results over the original column
[英]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.