我有一个表示加权有向图的 sqlite 表。列如下:
节点1 | 节点2 | 重量(节点1,节点2)
相反,我需要这张表:
节点1 | 节点2 | 重量(节点1,节点2)| 重量(节点2,节点1)
(node2 | node1 | weight(node2,node1) | weight (node1, node2) 不应该存在于表中)
我对SQL不太熟悉,所以我不知道如何从sqlite3中的原始表制作新表。
谢谢你的帮助。
我假设您的 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;
希望有帮助!