Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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 - Fatal编程技术网

SQL:插入到忽略中(如果存在)

SQL:插入到忽略中(如果存在),sql,Sql,我想从表1插入表2中没有的行。 将parentId=0的节点放在表2中是一个错误 因此,我需要从所有父项中获取所有子项,如果它们不在表2中,则插入它们,并使用父项在表2中使用的键 我为每张桌子准备了两把钥匙,而不是一把。这是我的问题 如果有人能帮我。我可以使用游标 Table1 IDNode, IDParent 1 0 2 1 3 1 4 1 5 0 6 5 Table2 IDNode, IDKey 1 1

我想
从表1插入表2中没有的行。

将parentId=0的节点放在表2中是一个错误

因此,我需要从所有父项中获取所有子项,如果它们不在表2中,则插入它们,并使用父项在表2中使用的键

我为每张桌子准备了两把钥匙,而不是一把。这是我的问题

如果有人能帮我。我可以使用
游标

Table1
IDNode, IDParent
1       0
2       1
3       1
4       1
5       0
6       5


Table2
IDNode, IDKey
1       1
1       7
2       6
4       2
5       3





IdNode  IDparent IDkey
2       1           1
3       1           1
4       1           1
2       1           7
3       1           7
4       1           7
remove the IDNode2 with IDKey6
remove the IDNode4 with IDKey2
6       5           4

父亲的钥匙更重要,如果在我的表2中我有一个带钥匙的父亲,我需要从表1中找到儿子,用父亲的钥匙插入他们,如果存在带不同钥匙的儿子,则将其删除,毕竟从表2中删除父节点

注意:这个答案假设了您正在使用的SQL的提供者/版本

DECLARE @temp table (idnode, idkey)

INSERT INTO @temp
SELECT 
   item.idnode, table2.idkey
FROM
    Table1 item
    inner join Table1 parent on item.idparent  = parent.idnode
    inner join Table2 on table2.idnode = parent.idnode;


SELECT * from @temp;
检查结果是否正确后,应返回所需结果:

下一部分假设您要删除现有的不匹配项

DELETE from table2;

insert into table2
select * from @temp;
要保留现有值,请执行以下操作:

insert into table2
select t.* from @temp t
left outer join table2 on table2.idnode = t.idnode
where table2.idnode is null

您可以在SQLServer2008中使用合并查询。您可以在以下链接中找到详细信息:


hi..我认为您在此处显示的表2的结果令人困惑..请澄清..“如果它们不在表2中,请使用父级在表2中的键插入它们”-不是最清晰的描述-但这可以解释它。我确实认为4的示例结果不正确,但是-它不应该是1吗?必须是2,因为那是在…您使用的是哪种DBMS?博士后?神谕DB2?Firebird?我不知道,但它不工作…它没有返回我所有的数据。对不起,我读错了,正在清理现有的数据。。。第二个选项更好吗?我认为最好是从tabe2上的父对象中获取所有子对象,并使用相同的键将它们插入表2中父对象,删除父对象,删除表2中存在的子对象,并使用不同的键。我怎么能做到呢?是的,现在我明白你想做什么了-这个方法有点复杂!我编辑、更新和解释得更好一点,这让我发疯!我会继续努力的,呵呵!!