我有一个表示加权有向图的sqlite表。列如下:
node1 | node2 |重量(节点1,节点2)
相反,我需要这张桌子:
node1 | node2 |权重(node1,node2)|重量(节点2,节点1)
(node2 | node1 | weight(node2,node1)| weight(node1,node2)不应存在于表中)
我对SQL不熟悉,所以我无法弄清楚如何从sqlite3中的原始表中创建新表。
感谢您的帮助。
答案 0 :(得分: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;
希望有所帮助!