Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询:通过合并现有表中的行来创建表,如下所示:_Sql_Sqlite - Fatal编程技术网

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

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

我有一个代表加权有向图的sqlite表。各栏如下:

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

相反,我需要这张桌子:

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

(表中不应存在节点2 |节点1 |权重(节点2,节点1)|权重(节点1,节点2))

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


谢谢您的帮助。

我假设您的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;