2014-02-20 3 views
0

Я пытаюсь написать запрос, который будет вставлять группу людей в таблицу, если это лицо не существует. Например, у меня есть таблица, полная людей, и мне нужно добавить больше людей в базу данных, и я не знаю, есть ли они там. Я знаю, что номер социального страхования (ssn) никогда не будет одинаковым для двух человек. Можно ли использовать запрос, чтобы проверить, находится ли ssn в таблице и не вставить ли человека в таблицу? Если ssn находится в таблице, перейдите к следующему человеку и проверьте?Вставьте строку, если она не существует через запрос

Я думал об использовании хранимой процедуры, но у меня нет никаких прав на создание процедуры хранения.

+0

Что у вас есть? – Mureinik

+1

Вы можете добавить ограничение 'UNIQUE, NOT NULL' в столбец' ssn' и добиться этого. – user2989408

+0

Какая у вас система управления базами данных? – wumpz

ответ

0

Вы можете вставить свои данные в таблицу переменных или таблицу temp, а затем таблицу INSERT INTO из таблицы temp, где она не существует в вашей таблице.

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 
0

Вот пара идей, которые помогут вам начать работу. Я много использую MERGE, потому что он предлагает такой контроль. Вы также можете изучить предложение IN как часть предиката WHERE в инструкции INSERT SELECT.

MERGE

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 
0

Вы могли бы сделать это так, если новые люди в другой таблице. Если нет, то воспользуйтесь решением Владимира.

INSERT INTO People(ssn, firstname, lastname) 
SELECT ssn, firstname, lastname 
FROM newpeople 
WHERE ssn not in (select ssn from people) 
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, вы знаете, что в объединенной таблице нет попадания.

Смежные вопросы