Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用来自另一个表和变量的唯一/不同数据填充表的SQL查询?_Sql_Sql Server_Database_Qt - Fatal编程技术网

使用来自另一个表和变量的唯一/不同数据填充表的SQL查询?

使用来自另一个表和变量的唯一/不同数据填充表的SQL查询?,sql,sql-server,database,qt,Sql,Sql Server,Database,Qt,我正在Windows7平台上使用MS SQL Server 2012和Qt5开发一个使用数据库的应用程序。我擅长Qt,但不具备SQL技能。 目前我有一个名为Devices的表,如下所示: DeviceSerial DeviceIPAddr DeviceSwVersion =========================================== 1000 192.168.1.1 8.00 1043 192.168.1.2

我正在Windows7平台上使用MS SQL Server 2012和Qt5开发一个使用数据库的应用程序。我擅长Qt,但不具备SQL技能。
目前我有一个名为
Devices
的表,如下所示:

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
(该表为空或在此操作之前应为空?)的表,该表应根据第一个表字段
deviceipddr
和我的应用程序中的参数(整数)值填充数据,如下所示:

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  
...    
对于
CommandQueue
表的所有行,
commandID
的值在同一时刻是相同的。为了示例/示例,我选择了30


如何创建SQL查询以填充
CommandQueue
表?

使用
插入到。。从
construct like中选择

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; 
插入命令队列(TargetIP,CommandID)
选择d.DeviceIPDR,
@某些参数值
从设备d
d.DeviceIPDR=ck.TargetIP上的左连接命令队列ck
和ck.CommandID@someparameter_值
其中ck.TargetIP为空;

使用
插入。。从
construct like中选择

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; 
插入命令队列(TargetIP,CommandID)
选择d.DeviceIPDR,
@某些参数值
从设备d
d.DeviceIPDR=ck.TargetIP上的左连接命令队列ck
和ck.CommandID@someparameter_值
其中ck.TargetIP为空;
以下内容将仅在CommandQueue中插入来自DevicePaddr+@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
以下内容将仅在CommandQueue中插入来自DevicePaddr+@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

我想在此之前我必须删除所有
CommandQueue
表行,对吗?。。。以防万一已经有了一些东西……好吧,我们的想法是在
CommandQueue
表中有唯一的IP,所以。。。如果表不是空的,那么除了在填充表之前删除所有行之外,没有其他方法可以保证(唯一的IP)。。。或者我遗漏了什么?如果您的IP列是键列(PK或unique key)列,那么插入重复项无论如何都会失败。所以你应该考虑把它变成一个键列,而不是删除行。如果它失败了,那么它就不好了,因为我需要<代码>命令> <代码>更新到我的应用程序发送的最新值……在这种情况下,改变查询本身。如果有帮助,请参阅回答中的编辑。我想在此之前我必须删除所有
CommandQueue
表行,对吗?。。。以防万一已经有了一些东西……好吧,我们的想法是在
CommandQueue
表中有唯一的IP,所以。。。如果表不是空的,那么除了在填充表之前删除所有行之外,没有其他方法可以保证(唯一的IP)。。。或者我遗漏了什么?如果您的IP列是键列(PK或unique key)列,那么插入重复项无论如何都会失败。所以你应该考虑把它变成一个键列,而不是删除行。如果它失败了,那么它就不好了,因为我需要<代码>命令> <代码>更新到我的应用程序发送的最新值……在这种情况下,改变查询本身。如果有帮助,请参阅答案中的编辑。感谢您提供的
TRUNCATE
提示!请允许我问一个问题:如果我只为SW版本为8.00的设备设置插入条件(请参见上面问题中的示例),该怎么办。该如何修改/调整查询?嗯。。。我们的想法是,
CommandID
必须更新为Qt应用程序提供的最新值,旧值应该被替换。。。如果你知道我的意思…更新--顺便说一句,我显然对你的应用程序一无所知,但是如果你需要从
设备
中提取唯一的DevicePaddr/DeviceSwVersion值,你可以通过添加索引来实现。我想
选择DISTINCT
正是这样做的,即提取唯一的IP。添加索引有什么帮助?我这样问是因为我对SQL不是很熟悉,所以您需要在几个update语句中这样做。(1) 插入新IP,(2)我不确定是否需要删除旧IP,但删除将是#2。(3) 最后更新到下一个CommandId。从技术上讲,你可以通过合并来完成这一切,但这太难看了。独特插入的“困难部分”已经得到回答。你需要其他人的帮助吗?谢谢你的
TRUNCATE
提示!请允许我问一个问题:如果我只为SW版本为8.00的设备设置插入条件(请参见上面问题中的示例),该怎么办。该如何修改/调整查询?嗯。。。我们的想法是,
CommandID
必须更新为Qt应用程序提供的最新值,旧值应该被替换。。。如果你知道我的意思…更新--顺便说一句,我显然对你的应用程序一无所知,但是如果你需要从
设备
中提取唯一的DevicePaddr/DeviceSwVersion值,你可以通过添加索引来实现。我想
选择DISTINCT
正是这样做的,即提取唯一的IP。添加索引有什么帮助?我这样问是因为我对SQL不是很熟悉,所以您需要在几个update语句中这样做。(1) 插入新IP,(2)我不确定是否需要删除旧IP,但删除将是#2。(3) 最后更新到下一个CommandId。从技术上讲,你可以通过合并来完成这一切,但这太难看了。独特插入的“困难部分”已经得到回答。你需要别人帮忙吗?