2010-11-25 11 views
1

私は、アクティビティネットワークを '解決する'アルゴリズムを使用しています。これはProject Managementのコース用です。このアルゴリズムは紙の上で動作しますが、コンピュータでそれを解決するには、自己結合テーブルに存在しないタプルを見つける巧妙なクエリが必要です。自己結合テーブルに存在しないタプル

のは、次のような活動をしているとしましょう: AはBになり、AはCになり、BはDになり、Cは、私が使用しています(「CPM」と呼ばれる)の表は、このように移入さD に行きます:

+----+----------+--------+---------+ 
| ID | Fromnode | Tonode | Counter | 
+----+----------+--------+---------+ 
| 1 | A  | B  | 0  | 
+----+----------+--------+---------+ 
| 2 | A  | C  | 0  | 
+----+----------+--------+---------+ 
| 3 | B  | D  | 0  | 
+----+----------+--------+---------+ 
| 4 | C  | D  | 0  | 
+----+----------+--------+---------+ 

対応する 'tonodes'を持たない 'fromnodes'をすべて返すクエリを作成しようとしています。これは私が書いたものです

select id, fromnode 
from cpm 
where counter = 0 
and not exists (select 'X' 
from cpm cpm1 
where tonode = cmp1.fromnode) 

しかし、これは最初の2つだけでなく、4つのタプルすべてを返しています。

「存在しない」を使用しているクエリは、そのまま理解するのは難しく、自己結合は状況を悪化させます。どのようなクエリをする必要がありますか?ところで、私はFirebirdを使用していますが、それは問題だとは思いません。 TIA、 No'amは

答えて

2

が外側を試し

参加:select a.id, a.fromnode from cpm as a left outer join cpm as b on a.fromnode = b.tonode where b.fromnode is null

+0

私はあなたの答えが間違った結果を出したとしてもそれを受け入れるかどうかわかりませんが、少なくとも正しい結果が示された(あるいは私があなたを惑わした)ことを示しました。あなたの質問は「A」ではなく「D」を返します。ここで正しいクエリである - –

+0

選択a.id、a.fromnode 左外側がa.fromnode = b.tonode 上のCPM B に参加したcpmから b.fromnodeがNo'am @ヌル –

+0

です:彼のアイデアでした正しいと彼は問題を解決(または方法を示した)、私は彼がちょうどクエリ自体で速くに行ったと思う。受け入れてくれてありがとう。 – Konerak

関連する問題