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