2016-01-21 5 views
0

Я использую MS SQL Server 2012 на платформе Windows7 и Qt5 для разработки приложения, которое использует базу данных. Я хорошо разбираюсь в Qt, но у меня нет навыков SQL.
В настоящее время у меня есть таблица с именем Devices который выглядит следующим образом:SQL-запрос для заполнения таблицы с использованием уникальных/отдельных данных из другой таблицы и переменной?

DeviceSerial DeviceIPAddr DeviceSwVersion 
=========================================== 
1000   192.168.1.1 8.00  
1043   192.168.1.2 8.00  
1045   192.168.1.2 8.01  
1049   192.168.1.3 8.00  
1055   192.168.1.4 8.00  
1058   192.168.1.6 8.00  
1060   192.168.1.5 8.00  
1061   192.168.1.8 8.01  
1066   192.168.1.3 8.00  
1070   192.168.1.10 8.00  
1071   192.168.1.12 8.00  
... 

Существует также другая таблица с именем CommandQueue, (то есть пустой или она должна быть перед этой операцией?), И что она должна быть заполнена данными , на основе первого поля таблицы DeviceIPAddr и значение параметра (целое число) из моего приложения, как показано ниже:

TargetIP  CommandID 
======================== 
192.168.1.1 30 
192.168.1.2 30 
192.168.1.3 30 
192.168.1.4 30 
192.168.1.5 30 
192.168.1.6 30 
192.168.1.8 30 
192.168.1.10 30 
192.168.1.12 30 
...  

значение commandID одно и то же в один момент времени для всех строк CommandQueue таблицы , Для примера/образца я выбрал 30.

Как создать SQL-запрос для заполнения таблицы CommandQueue?

ответ

1
-- TRUNCATE is quickest way to make sure its empty. 
-- If you do a DELETE with a million rows, it could 
-- take 5 min to delete. With TRUNCATE it will take 
-- 1-second no matter how many rows. 
TRUNCATE TABLE CommandQueue 
GO 

INSERT INTO CommandQueue 
     (TargetIP , 
      CommandID) 
SELECT DISTINCT -- Only unique rows 
     DeviceIPAddr , 
     @parameter1 
FROM Devices; 
GO 

Следующие данные будут вставлять только в данные CommandQueue из Устройства, где параметр DeviceIPAddr + @1 уже не находится в CommandQueue. Записи, вставленные должны иметь DeviceSwVersion = 8.

INSERT INTO CommandQueue 
     (TargetIP , 
      CommandID) 
SELECT DISTINCT -- Only unique rows 
     DeviceIPAddr , 
     @parameter1 
FROM Devices a 
     LEFT OUTER JOIN CommandQueue b ON a.DeviceIPAddr = b.TargetIP 
              AND b.CommandID = @parameter1 
WHERE b.DeviceIPAddr IS NULL 
     AND a.DeviceSwVersion = 8 
+0

Спасибо за подсказку 'TRUNCATE'! Один вопрос, если вы позволите мне: Что делать, если я устанавливаю вставку только для устройства, имеющего версию версии 8.00 (см. Мой пример в вопросе выше). Как следует модифицировать/адаптировать запрос? –

+0

Хммм ... идея в том, что 'CommandID' должен быть обновлен до последнего значения, предоставленного приложением Qt, старые значения должны быть заменены ... если вы знаете, что я имею в виду ... –

+0

Обновлено - - Кстати, я, очевидно, ничего не знаю о вашем приложении, но если вам нужно вывести уникальные значения DeviceIPAddr/DeviceSwVersion из «Устройства», вы можете попробовать это, просто добавив индекс. –

2

Использование INSERT INTO .. SELECT FROM конструкция как

insert into CommandQueue(TargetIP, CommandID) 
select DeviceIPAddr, 
@someparameter_value 
from Devices; 

Вы можете так же трудно код, значение, если вы хотите говоря

insert into CommandQueue(TargetIP, CommandID) 
select DeviceIPAddr, 30 //assuming CommandID is INT 
from Devices; 

за ваш комментарий, вы можете изменить сам запрос как

insert into CommandQueue(TargetIP, CommandID) 
select d.DeviceIPAddr, 
@someparameter_value 
from Devices d 
left join CommandQueue ck on d.DeviceIPAddr = ck.TargetIP 
and ck.CommandID <> @someparameter_value 
where ck.TargetIP is null; 
+0

Я предполагаю, что я должен удалить все 'CommandQueue' строки таблицы до этого, я прав? ... только в случае, если есть уже что-то там ... –

+0

НЕТ , не обязательно. – Rahul

+0

Ну, идея состоит в том, чтобы иметь _unique IPs_ в таблице 'CommandQueue', поэтому ... Если таблица не пуста, нет другого способа гарантировать это (_unique IPs_), но для удаления всех строк до заполнения таблицы. .. Или я что-то упускаю? –

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