2017-02-22 12 views
0

はのは、私は彼らがすべて接続されているので、私のクエリでこれらの行のすべてを持参する必要があり、次の表CONNECT BY - ORACLE - できる唯一のcicle

RowId | SourceId | TargetId 
---------|----------|---------- 
    1 | 1  | 2 
    2 | 2  | 3 
    3 | 2  | 4 
    4 | 4  | 5 
    5 | 5  | 6 
    6 | 6  | 5 

を持っているとしましょう。 しかし、私はこれを行うとき:

SELECT RowId 
FROM MyTable 
START WITH SourceId = 1 
CONNECT BY NOCYCLE PRIOR TargetId = SourceId 

をそれは、ROWIDを持つ行をもたらすことはありません私はそれが理由NOCYCLEキーワードのだと思います6.

に等しいです。しかし、私がそれを取り除くと、そこに1つのcicleがあるので、クエリは機能しません。

私はすべてを持って来るクエリを設定したかったのです。皆さんは何か考えていますか?

+1

は 'RowID' - 良いではないが、それは' Row_ID'を作る...予約語です。 – mathguy

答えて

3

サイクルを指して作業することにより、同じ考え方を適用CONNECT BY

select * 
    from test et 
where exists(select 1 
       from test it 
       where et.targetId = it.sourceId OR it.targetId = et.sourceId) 
order by row_id; 

を使用せずに、代替バージョンですCONNECT BY句、特にPRIOR演算子の対象となる列のみです。

この例では、この追加条件(下記)が効果がないように見えますが、この例ではそうです。それを試してみてください。もちろん

and PRIOR Row_ID IS NOT NULL 

を追加し、何Row_IDはこれまでヌルではないので、これはロジックを変更しません。サイクルが存在するかどうかを判断する際に考慮される値にRow_IDの値が追加されるため、すべての行を取得できます。

(注 - 私はOracleとの競合を避けるためにRow_IDからRowIDを変更するために私の答えを編集した単語を禁じます。)

+0

確かに言います。ありがとうございました! –

3

解決策が見つかりました。

SELECT myRowId 
FROM myTable 
START WITH SourceId = 1 
CONNECT BY NOCYCLE PRIOR TargetId = SourceId or TargetId = PRIOR SourceId 

あなたと共有しています。ありがとう。

+0

私は同意しません。これはうまくいくかもしれませんが、それは "正しい"答えではありません。 (もちろん、私はちょうど別のものを与えました、そして、それは正しいものだと私は信じています!) – mathguy

0

これは機能します。しかし、本当にあなたが望むものについてCONNECT BYが必要なわけではありません。ここで

は、それはかなりの行が含まれた列の値に基づいて検出された互いに

+0

再帰と 'start with'部分はどうやってやりますか? (質問には1つの関連データグループしか表示されませんが、それがテーブル全体であれば 'myrowidからmyrowidを選択すれば十分です...) –

+0

正確には、1つの関連データグループしか表示されません –

+0

質問に誤解私が得たのは、お互いに関連している彼のテーブルのすべてのレコードをリストしたかったということでした。例えばsourceId = 99かつtargetId = 100のレコードだった場合、それは選択されていませんでした。これが自分の望むものではない場合は私のせいですが、これは私の解釈である ' すべてが接続されているため、これらの行をすべてクエリに持って行かなければならない' – Julian