2017-06-30 10 views
2
現在

以下に説明するように、当社の製品の一つで、我々はロジックでクエリを持っている:OracleのSQL Connectによってロジック

create table temp (emp_id varchar2(3), manager_id varchar2(3)) 

データ:

E10 E20 
E20 E50 
E30 E50 
E50 E90 

問合せ:

select * 
from Temp 
    Start with EMP_ID = 'E90' 
    Connect by Prior EMP_ID = MANAGER_ID and EMP_ID != MANAGER_ID 
order by EMP_ID 

Iをクエリの概念を理解する[&接続する]これは、すべての子レコードを取得する必要があることです。 f現在の従業員レコードを含む指定された従業員。私は最後にEMP_ID != MANAGER_IDを追加する必要性について疑問を抱いています。

&という質問がなぜ追加されたのかは疑問です。

答えて

3

最後の条件はデータには適用されませんが、無限再帰を避けることは非常に重要です。

E40 E40 

あなたの代わりにE90E40で起動した場合は、OracleはEMP_ID != MANAGER_ID条件なしで無限再帰にスピンしてしまうため、:

この点を説明するために、あなたがあなたのテーブルに別の行を追加した場合に何が起こるかを検討E40E40に接続します。このクエリを書くことへのより良いアプローチではなく、明示的なチェックでのコーディングのNOCYCLEオプションを使用することです

注:

SELECT * 
FROM Temp 
    START WITH EMP_ID = 'E90' 
    CONNECT BY NOCYCLE PRIOR EMP_ID = MANAGER_ID 
ORDER BY EMP_ID 
関連する問題