SQL查询:通过合并现有表中的行来创建表,如下所示:

时间:2012-06-19 15:57:20

标签: sql sqlite

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

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

相反,我需要这张桌子:

node1 | node2 |权重(node1,node2)|重量(节点2,节点1)

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

我对SQL不熟悉,所以我无法弄清楚如何从sqlite3中的原始表中创建新表。

感谢您的帮助。

1 个答案:

答案 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;

希望有所帮助!