2016-01-21 94 views
0

我在Windows7平台和Qt5上使用MS SQL Server 2012开发使用数据库的应用程序。我擅长Qt,但我没有SQL技能。
目前,我有一个名为Devices表看起来像这样:SQL查询使用来自其他表和变量的独特/不同数据填充表的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 + @ parameter1尚未在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'小费!一个问题,如果你请允许我:如果我只适用于SW版本为8.00的设备(请参阅上面问题中的示例),该怎么办?如何修改/改编查询? –

+0

嗯...这个想法是'CommandID'必须更新到Qt应用程序提供的最新值,旧值应该被替换......如果你知道我的意思... –

+0

已更新 - - 顺便说一句,我显然不知道关于你的应用程序的任何其他内容,但是如果你需要从'Devices'中取出唯一的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

NO , 不必要。 – Rahul

+0

好,这个想法是在'CommandQueue'表中有_unique IPs_,所以...如果表不是空的,没有其他方法可以保证(_unique IPs_),但在填充表之前删除所有行。 ..或者我错过了什么? –