我正在尝试编写一个查询,如果该人不存在,会将一组人员插入到表中。例如,我有桌子上的人,我需要在数据库中添加更多人,我不知道他们是否已经在那里。我知道两个人的社会安全号码(ssn)永远不会相同。是否可以使用查询来检查ssn是否在表中,如果没有将该人插入表中?如果ssn在表中,那么去下一个人检查?
我正在考虑使用存储过程,但我没有任何权限来创建存储过程。
答案 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,则表示在连接表中没有命中。