SQL Server 2017边表插入问题:导入数据时遇障碍
解决SQL Server 2017图数据库边表导入问题
嘿,我来帮你搞定这个边表导入的麻烦!你说导入节点表没问题,但从kontomappingDetaljeret表导入边表卡壳了——核心问题其实是边表需要关联节点表的系统生成$node_id,而不是直接用你的业务字段(kontoNummer/refNr)。我给你一步步拆解:
第一步:确认边表的正确创建
首先得确保你的边表关联了对应节点表,比如假设你有两个节点表:KontoNodes(存储kontoNummer节点)和RefNrNodes(存储refNr节点),那边表得这么建:
-- 创建边表,指定连接的节点表方向(根据你的业务关系调整方向) CREATE TABLE KontoToRefNr ( -- 这里可以加额外的关系属性,比如创建时间之类的,按需添加 CONSTRAINT EC_KontoToRefNr CONNECTION (KontoNodes TO RefNrNodes) ) AS EDGE;
注意CONNECTION里的顺序很重要,对应边的起点($from_id)和终点($to_id)。
第二步:关联节点表插入边数据
接下来就是从kontomappingDetaljeret里匹配两个节点的$node_id,再插入边表:
INSERT INTO KontoToRefNr ($from_id, $to_id) SELECT kn.$node_id AS $from_id, rn.$node_id AS $to_id FROM kontomappingDetaljeret kmd -- 匹配kontoNummer对应的节点 JOIN KontoNodes kn ON kmd.kontoNummer = kn.kontoNummer -- 匹配refNr对应的节点 JOIN RefNrNodes rn ON kmd.refNr = rn.refNr;
常见坑点排查
如果执行还是有问题,大概率是以下几个原因:
- 数据不匹配:
kontomappingDetaljeret里的某些kontoNummer/refNr在对应的节点表里找不到。可以用LEFT JOIN排查:
这些就是无法匹配节点的记录,要么补全节点数据,要么过滤掉。SELECT kmd.* FROM kontomappingDetaljeret kmd LEFT JOIN KontoNodes kn ON kmd.kontoNummer = kn.kontoNummer LEFT JOIN RefNrNodes rn ON kmd.refNr = rn.refNr WHERE kn.$node_id IS NULL OR rn.$node_id IS NULL; - 节点重复:如果节点表中同一个kontoNummer/refNr存在多条记录,会导致生成多条重复边。可以先给节点表的业务字段加唯一约束,或者插入边时加
DISTINCT:INSERT INTO KontoToRefNr ($from_id, $to_id) SELECT DISTINCT kn.$node_id, rn.$node_id FROM kontomappingDetaljeret kmd JOIN KontoNodes kn ON kmd.kontoNummer = kn.kontoNummer JOIN RefNrNodes rn ON kmd.refNr = rn.refNr; - 连接方向搞反:如果你的业务关系是refNr指向kontoNummer,那
CONNECTION就得写成(RefNrNodes TO KontoNodes),对应插入时$from_id和$to_id也要调换。
如果还有具体的报错信息或者表结构细节,随时说,我再帮你调整!
内容的提问来源于stack exchange,提问作者Henrik Poulsen
相关产品推荐
相关产品推荐

