2016-01-21 43 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_),但在填充表之前刪除所有行。 ..或者我錯過了什麼? –