自联接表中不存在的元组

时间:2010-11-25 13:46:58

标签: sql

我正在使用算法来“解决”活动网络 - 这是一个项目管理课程。该算法在纸上工作,但为了用计算机解决它,我需要一个聪明的查询,它在自联接表中找到不存在的元组。

假设活动如下: A转到B,A转到C,B转到D,C转到D 我正在使用的表格(称为“CPM”)因此填充:

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

我正在尝试编写一个返回所有'fromnodes'的查询,这些'fromnodes'没有相应的'tonodes'。这就是我写的

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

但这会返回所有四个元组,而不仅仅是前两个元组。

使用“不存在”的查询很难理解,并且自联接只会使事情变得更糟。该查询应该是什么?顺便说一下,我正在使用Firebird,但我不认为这就是问题所在。

TIA, No'am

1 个答案:

答案 0 :(得分: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