sql查询:通过合并现有表中的行来创建表,如下所示:
我有一个代表加权有向图的sqlite表。各栏如下: 节点1 |节点2 |权重(节点1,节点2) 相反,我需要这张桌子: 节点1 |节点2 |权重(节点1,节点2)|权重(节点2,节点1) (表中不应存在节点2 |节点1 |权重(节点2,节点1)|权重(节点1,节点2)) 我对SQL不太熟悉,所以我不知道如何从sqlite3中的原始表生成新表sql查询:通过合并现有表中的行来创建表,如下所示:,sql,sqlite,Sql,Sqlite,我有一个代表加权有向图的sqlite表。各栏如下: 节点1 |节点2 |权重(节点1,节点2) 相反,我需要这张桌子: 节点1 |节点2 |权重(节点1,节点2)|权重(节点2,节点1) (表中不应存在节点2 |节点1 |权重(节点2,节点1)|权重(节点1,节点2)) 我对SQL不太熟悉,所以我不知道如何从sqlite3中的原始表生成新表 谢谢您的帮助。我假设您的node1和node2是链接到节点表的整数外键,而您提到的表是边缘表 假设已使用以下内容创建边缘表: CREATE TABLE ed
谢谢您的帮助。我假设您的node1和node2是链接到节点表的整数外键,而您提到的表是边缘表 假设已使用以下内容创建边缘表:
CREATE TABLE edges( node1 INTEGER, node2 INTEGER, weight REAL );
比如(假设没有自弧,并且对于a->b的每个链接,也有一个b->a的链接):
创建表新边(节点1整数、节点2整数、权重1实数、权重2实数);
插入到新边中
选择e1.node1、e1.node2、e1.weight、e2.weight
从边作为e1内部连接边作为e2
在e1.node1=e2.node2和e1.node2=e2.node1上
其中e1.node1
自连接将前后边缘进行对比,并且e1.node1小于e1.node2的要求确保您只能看到每个对比的边缘一次
编辑以响应为缺少的后边缘填写零的请求:
对于缺少后向边,可以执行左连接并使用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;
插入到新边中
选择
e1.node1,
e1.node2,
e1.重量,
如果e2.weight为空,则为0.0,否则e2.weight结束
从边作为e1左连接边作为e2
在e1.node1=e2.node2和e1.node2=e2.node1上
其中e1.node1
希望有帮助 非常感谢!这适用于每个前向边都有后向边的情况,但这里的情况并非如此。在这种情况下,我想用零作为后向边的权重。这在SQL中也是可能的吗?对不起,原来的问题不清楚。谢谢。@user1466926。我的荣幸。斯坦福大学目前正在在线运行其数据库101课程,这将帮助您以结构化的方式跟上进度:
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;