如果通过查询不存在,则插入一行

时间:2014-02-20 20:55:12

标签: sql sql-server sql-server-2008-r2

我正在尝试编写一个查询,如果该人不存在,会将一组人员插入到表中。例如,我有桌子上的人,我需要在数据库中添加更多人,我不知道他们是否已经在那里。我知道两个人的社会安全号码(ssn)永远不会相同。是否可以使用查询来检查ssn是否在表中,如果没有将该人插入表中?如果ssn在表中,那么去下一个人检查?

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

4 个答案:

答案 0 :(得分:0)

您可以将数据插入表变量或临时表,然后将临时表中的INSERT INTO表插入表中。

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

答案 1 :(得分:0)

以下是一些让您入门的想法。我使用MERGE很多,因为它提供了如此多的控制。您还可以在INSERT SELECT语句中查看IN子句作为WHERE谓词的一部分。

<强>合并

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')

--MERGE
MERGE INTO @PERSONTABLE AS T
USING @NEWPEOPLE AS S
ON (T.FirstName = S.FirstName)
WHEN NOT MATCHED BY TARGET THEN
    INSERT (FirstName) VALUES (S.FirstName);

SELECT * FROM @PERSONTABLE

<强>除非

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

这是我经常使用的另一种选择。通常连接比子选择更好...如果连接表值为null,则表示在连接表中没有命中。