0

我有一个表示加权有向图的 sqlite 表。列如下:

节点1 | 节点2 | 重量(节点1,节点2)

相反,我需要这张表:

节点1 | 节点2 | 重量(节点1,节点2)| 重量(节点2,节点1)

(node2 | node1 | weight(node2,node1) | weight (node1, node2) 不应该存在于表中)

我对SQL不太熟悉,所以我不知道如何从sqlite3中的原始表制作新表。

谢谢你的帮助。

4

1 回答 1

0

我假设您的 node1 和 node2 是链接到节点表的整数外键,而您提到的表是边缘表?

假设边缘表是用类似的东西创建的:

CREATE TABLE edges( node1 INTEGER, node2 INTEGER, weight REAL );

怎么样(假设没有自弧,并且对于来自 a->b 的每个链接,也有来自 b->a 的链接):

CREATE TABLE newedges( node1 INTEGER, node2 INTEGER, weight1 REAL, weight2 REAL );

INSERT INTO newedges
    SELECT e1.node1, e1.node2, e1.weight, e2.weight
    FROM edges AS e1 INNER JOIN edges AS e2
    ON e1.node1=e2.node2 AND e1.node2=e2.node1
    WHERE e1.node1 < e1.node2;

自连接会整理前向和后向边,并且 e1.node1 小于 e1.node2 的要求确保您只能看到每个已整理的边一次。

编辑以响应为缺少的向后边缘填充零的请求:

对于缺少的向后边缘,您可以执行 LEFT JOIN 并使用 CASE 语句用零填充间隙:

INSERT INTO newedges
    SELECT
        e1.node1,
        e1.node2,
        e1.weight,
        CASE WHEN e2.weight IS NULL THEN 0.0 ELSE e2.weight END
    FROM edges AS e1 LEFT JOIN edges AS e2
    ON e1.node1=e2.node2 AND e1.node2=e2.node1
    WHERE e1.node1 < e1.node2;

希望有帮助!

于 2012-06-19T16:08:31.650 回答