Sql 通过查询插入不存在的行

Sql 通过查询插入不存在的行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我正在尝试编写一个查询,如果一组人不存在,则该查询会将该组人插入表中。例如,我的表中满是人,我需要向数据库中添加更多的人,但我不知道他们是否已经存在。我知道两个人的社会保险号码ssn永远不会相同。是否可以使用查询检查ssn是否在表中,如果不在表中,是否可以将此人插入表中?如果ssn在表中,则转到下一个人并检查 我正在考虑使用存储过程,但我没有创建存储过程的任何权限。您可以将数据插入到表变量或临时表中,然后从临时表中插入到表中,而临时表中不存在数据 DECLARE @Inserted AS TAB

我正在尝试编写一个查询,如果一组人不存在,则该查询会将该组人插入表中。例如,我的表中满是人,我需要向数据库中添加更多的人,但我不知道他们是否已经存在。我知道两个人的社会保险号码ssn永远不会相同。是否可以使用查询检查ssn是否在表中,如果不在表中,是否可以将此人插入表中?如果ssn在表中,则转到下一个人并检查


我正在考虑使用存储过程,但我没有创建存储过程的任何权限。

您可以将数据插入到表变量或临时表中,然后从临时表中插入到表中,而临时表中不存在数据

DECLARE @Inserted AS TABLE
    (
     NAME VARCHAR(50)
    ,SSN DECIMAL(10, 0)
    )


INSERT INTO @Inserted
        ( NAME, SSN )
    VALUES  ( 'Bob', 123456789 )
    ,       ( 'John', 123546789 )
    ,       ( 'James', 123456798 )

INSERT INTO MyTable
        SELECT *
            FROM @Inserted AS i
            LEFT OUTER JOIN MyTable AS m
                ON i.SSN = m.SSN
            WHERE m.SSN IS NULL

以下是一些让你开始的想法。我经常使用MERGE,因为它提供了很多控制。您还可以将IN子句作为INSERT SELECT语句中WHERE谓词的一部分进行查看

合并

除了


如果新人在另一张桌子上,你可以这样做。如果不是,则使用弗拉基米尔的解决方案

INSERT INTO People(ssn, firstname, lastname)
SELECT ssn, firstname, lastname
FROM   newpeople 
WHERE  ssn not in (select ssn from people )

这是我经常使用的另一个选项。通常连接比子选择更好。。。如果联接表的值为null,则知道联接表中没有命中

到目前为止,您得到了什么?您可以在ssn列上添加一个唯一的非空约束并实现这一点。您的数据库管理系统是什么?如何工作?如果我有一个像INSERT-INTO-people-fname,lname,ssn,VALUES'John','Doe','555-55-5555'这样的语句,那会是什么样子?我知道两个人的社会保险号码ssn永远不会相同。如果你把这个假设抛到脑后,你会在今后的道路上省去一些痛苦。场景:使用不正确的数据将人员A插入数据库。人员B现在无法插入正确的SSN。你拒绝了错误的记录仅仅是因为A先到了那里。该方法的准确率约为50%。
DECLARE @PERSONTABLE TABLE (ID INT PRIMARY KEY IDENTITY(1,1), FirstName VARCHAR(max))
    INSERT INTO @PERSONTABLE (FirstName) VALUES ('Bill'),('Sally'),('Bob')

    DECLARE @NEWPEOPLE TABLE (FirstName VARCHAR(max))
    INSERT INTO @NEWPEOPLE (FirstName) VALUES ('Jim'), ('Sally')

    --EXCEPT

    INSERT INTO @PERSONTABLE (FirstName)
    SELECT FirstName FROM @NEWPEOPLE
    EXCEPT
    SELECT FirstName FROM @PERSONTABLE

    SELECT * FROM @PERSONTABLE
INSERT INTO People(ssn, firstname, lastname)
SELECT ssn, firstname, lastname
FROM   newpeople 
WHERE  ssn not in (select ssn from people )
INSERT INTO People(ssn, firstname, lastname)
SELECT np.ssn, np.firstname, np.lastname
FROM newpeople np
LEFT JOIN People p on np.ssn = p.ssn
WHERE p.ssn IS NULL