2016-02-10 2 views
1

Я использую SQL Server 2012 для Windows7. В настоящее время у меня есть 2 таблицы.Как вставить в таблицу новые записи на основе информации из другой таблицы?

Первая таблица:

DeviceID DeviceSwVersion DeviceIPAddr 
1   802    172.26.20.1 
115  800    172.26.18.1 
1234  264    172.26.18.3 
4717  264    172.26.19.2 // <- new 
14157  264    172.26.19.1 // <- new 

Вторая таблица:

DeviceIPAddr Status TimeStamp (default=getdate()) 
172.26.20.1 1  2016-02-09 10:25:01 
172.26.18.1 1  2016-02-09 10:30:12 
172.26.18.3 1  2016-02-09 10:33:08  

Что мне нужно, это SQL-запрос для вставки в 2-й таблицы новых строк, соответствующих новым DeviceIP, которые в настоящее время в первая таблица. ТолькоDeviceIP с, что еще нет во второй таблице.

Итак, наконец, вторая таблица должна выглядеть следующим образом:

DeviceIPAddr Status TimeStamp // default = getdate() 
172.26.20.1 1  2016-02-09 10:25:01 
172.26.18.1 1  2016-02-09 10:30:12 
172.26.18.3 1  2016-02-09 10:33:08  
172.26.19.2 0  2016-02-10 09:53:00 
172.26.19.1 0  2016-02-10 09:53:01 

Примечание: Status столбец 0 для новых вставленных строк и TimeStamp текущая дата-функция времени (значение по умолчанию заполняется автоматически GETDATE()).

+2

Попробуйте использовать триггер для этого –

+0

Я бы попытался, но я не знаю как. Я очень новичок в SQL. :(... Пожалуйста, советую. –

+1

@groenhen, Как сказал Пареш, я думаю, что триггер '' ПОСЛЕ INSERT'' является лучшим решением. Поскольку вы новичок, мой ответ дает вам представление о вашем требуемом триггере. – mmuzahid

ответ

0

Вы можете написать ПОСЛЕ INSERT TRIGGER что-то вроде ниже:

CREATE TRIGGER trigger_insert_table_1 
    ON table_1 
    AFTER INSERT AS 
BEGIN 

    INSERT INTO table_2 
    (DeviceIPAddr, 
    Status, 
    TimeStamp) 
    VALUES 
    (NEW.DeviceIPAddr, 
    0, 
    getdate()); 

END; 
1
insert into secondtable 
select deiviceipaddr,0,getdate() 
from isttable t1 
where not exists(select 1 from secondtable t2 where t1.ipaddress=t2.ipaddress) 

--- еще один способ

insert into secondtable 
select deiviceipaddr,status from firsttable 
except 
select deiviceipaddr,status from secondtable 
1
INSERT Table2 
SELECT DeviceIPAddr, 0, getDate() 
FROM Table1 
WHERE DeviceIpAddr NOT IN (SELECT DeviceIpAddr FROM Table2) 
1
Insert into table2 
(DeviceIPAddr, Status, TimeStamp) 

SELECT t1.deiviceipaddr, 0, GETDATE() 
FROM Table1 
Left Outer Join Table2 
ON (t1.DeviceIPAddr = t2. DeviceIPAddr) 
WHERE t2. DeviceIPAddr IS NULL 
1

Таким образом, вы можете использовать NOT EXISTS() для этого, как это:

INSERT INTO SecondTable 
(SELECT t.DeviceIpAddr , 0 as status,getdate() 
FROM FirstTable t 
WHERE NOT EXISTS(select 1 from SecondTable s where t.DeviceIpAddr = s.DeviceIpAddr) 

Или ты может использовать NOT IN() следующим образом:

INSERT INTO SecondTable 
(SELECT t.DeviceIpAddr , 0 as status,getdate() 
FROM FirstTable t 
WHERE t.DeviceIpAddr NOT IN(select distinct s.DeviceipAddr from SecondTable) 
2

Merge другой способ ..

MERGE <[The second table]> t 
USING [The first table: ] s 
    ON t.DeviceIPAddr = s.DeviceIPAddr 
WHEN NOT MATCHED 
    INSERT (DeviceIPAddr, Status, Timestamp) 
    VALUES (s.DeviceIPAddr,0, getutcdate()) 
; 
1
DECLARE @Table1 TABLE 
    (DeviceID int, DeviceSwVersion int, DeviceIPAddr varchar(11)) 
; 

INSERT INTO @Table1 
    (DeviceID, DeviceSwVersion, DeviceIPAddr) 
VALUES 
    (1, 802, '172.26.20.1'), 
    (115, 800, '172.26.18.1'), 
    (1234, 264, '172.26.18.3'), 
    (4717, 264, '172.26.19.2'), 
    (14157, 264, '172.26.19.1') 
; 

DECLARE @Table2 TABLE 
    (DeviceIPAddr varchar(11), Status int, TimeStamp varchar(19)) 
; 

INSERT INTO @Table2 
    (DeviceIPAddr, Status, TimeStamp) 
VALUES 
    ('172.26.20.1', 1, '2016-02-09 10:25:01'), 
    ('172.26.18.1', 1, '2016-02-09 10:30:12'), 
    ('172.26.18.3', 1, '2016-02-09 10:33:08') 

; ИСПОЛЬЗОВАНИЕ НЕ СУЩЕСТВУЕТ

Select TT.DeviceIPAddr,0 Status,getdate() TimeStamp from @Table1 TT 
     where NOT EXISTS 
       (select 1 from @Table2 T where T.DeviceIPAddr = TT.DeviceIPAddr) 

ИЛИ

ИСПОЛЬЗОВАНИЕ КРОМЕ

Select TT.DeviceIPAddr,0 AS Status, getdate() AS TimeStamp from @Table1 TT 
EXCEPT 
select T.DeviceIPAddr,0 AS Status, getdate() AS TimeStamp from @Table2 T 
+0

getdate() вернет неправильные результаты – TheGameiswar

+0

Но SO упоминает Дата по умолчанию, насколько мы фильтруем записи на основе DeviceIPaddress @TheGameiswar – mohan111

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