检查 sqlite 中的元组非成员资格

Check for tuple non membership in sqlite

我正在研究一项 sql 作业,通过迭代添加到现有的 table 路径来确定有向图上各个节点之间的 "degree of separation",路径是一个 "link"更长。 (a link 是长度为 1 的给定路径)

作为这个过程的一个步骤,我正在创建一个 table 来临时包含要在给定迭代中添加的新路径,这只是在上一次迭代中添加的路径扩展一个 link.

我的问题是阻止添加连接两个已在路径 table 中连接的节点的新路径。这里的路径定义为(src, dst, length)。 table 也用这些字段定义。

这是我的部分解决方案:

INSERT INTO pathsNew
    select p.src, l.dst, 1 + length
    from pathsLastUpdated as p, links as l
    where p.dst=l.src and ...;

我尝试使用以下内容扩充 where 子句:

... (p.src, l.dst) not in (select src, dst from paths)

但是 sqlite 似乎不支持元组。最简单的解决方法是什么?

您可以使用:

WHERE
    NOT EXISTS (SELECT * FROM paths P2 WHERE P2.src = P.src AND P2.dst = P.dst

不过,您会 运行 遇到该方法的另一个潜在问题 - 即不断循环的路径。如果您只是在寻找最短路径并且已经保证有一条路径那么那可能没问题(可能只是一些额外的处理),但如果路径可能不存在那么您可能会陷入无限循环。