日期:2014-05-16  浏览次数:20890 次

Access中的Update难题
Update DayReport
Set DayReport.Temp01Min= (SELECT Min(DataReceived.RTmp01) AS 表达式1 FROM DataReceived WHERE (((DataReceived.Equipno)=1) AND ((DateDiff("d",[Rdatadate],#2/3/2010#))=0)))
Where DayReport.Equipno=1 and DateDiff('d',DayReport.ReportDay,#2010-2-3#)=0;

以上是一条在Access2007“查询设计”中执行的一条查询语句,我想在access2007调试通过后移植到.net中去运行
但是运行 报“操作必须使用一个可更新的查询”,我上网查了查,原因可能是因为没有找出要赋值的信息。
我在access2007单独执行

SELECT Min(DataReceived.RTmp01) AS 表达式1 FROM DataReceived WHERE (((DataReceived.Equipno)=1) AND ((DateDiff("d",[Rdatadate],#2/3/2010#))=0));

是可以查询出一行一列的信息"0.02",我将原更新语句改为
Update DayReport
Set DayReport.Temp01Min= 0.02
Where DayReport.Equipno=1 and DateDiff('d',DayReport.ReportDay,#2010-2-3#)=0;
也可以运行通过

接下来我说一下实现目的,DayReport是日报表,DataReceived是接收数据的总表,
DataReceived数据表要接受每天的每分钟来自各路传感器的实时数值信息及时间,存储起来,DayReport每天将前一天某个设备(对应Equipno=1)各路传感器的最值信息(对应Temp01Min)及对应出现的时间(对应DataReceived表的Rdatadate)存储起来,因为一共涉及32路数据(Temp01···Temp32),我每次只能在DataReceived
接受总表中找出一路的最值信息及对应时间,第一次可直接将第1路的最值信息及时间insert into DayReport,

Insert Into [DayReport](EquipNo,ReportDay,Temp01Max,Temp01MaxTime) Select Equipno,Rdatadate,Max(RTmp01),Rdatadate From [DataReceived] Where Equipno=1 and DateDiff('d',Rdatadate,#2010-2-2#)=0 Group by Equipno,Rdatadate,RTmp01;
------这条语句执行成功



但从第2路开始,到32路,就必须用Update DayReport将最值信息,和最值对应时间的信息分别更新到DayReport表去,在执行Update语句时,出现上述报错。

我的疑问如下:
1 Update每次只能执行一个字段的赋值吗?我想将每路的最新信息及对应时间以一条Update语句插入日报表中。
2 Access中支持Update语句赋值中包含Select语句吗?如 set 列1=(Select····)
3 因为操作的路数比较多,执行的SQL语句也比较多,能有稍微便捷些的解决方案吗?

  这个问题困扰我好久了,请大虾能不吝赐教。


------解决方案--------------------
1 Update每次只能执行一个字段的赋值吗?我想将每路的最新信息及对应时间以一条Update语句插入日报表中。
update 可以 set col1=1,col2=2,...

2 Access中支持Update语句赋值中包含Select语句吗?如 set 列1=(Select····)
支持。

3 因为操作的路数比较多,执行的SQL语句也比较多,能有稍微便捷些的解决方案吗?
要看你具体的需求。


ACCESS对UPDATE有一些限制。

建议你列出表结构,并提供测试数据。 否则仅通过文字很难理解你想实现什么功能。
------解决方案--------------------
Update DayReport 
Set DayReport.Temp01Min= dmin(
'RTmp01','DataReceived','Equipno=1 AND DateDiff("d",[Rdatadate],#2/3/2010#)=0')
Where Equipno=1 and DateDiff('d',ReportDay,#2010-2-3#)=0;