使用/选择子查询更新 - 正确吗?

时间:2011-01-14 22:11:13

标签: sql-server ms-access access-vba

我很紧张地触发了这个查询,因为我没有那么多地使用子查询。我想确保这个野兽按照我的计划做我想做的事。

DoCmd.RunSQL ("UPDATE Gage_Master SET Gage_Master.Est_Calibration_Cost = SELECT dbo_Gage_Master.Est_Calibration_Cost FROM dbo_Gage_Master WHERE dbo_Gage_Master.Est_Calibration_Cost <> Gage_Master.Est_Calibration_Cost WHERE Gage_Master.Gage_ID = dbo_Gage_Master.Gage_ID;")

基本上 - 这只小狗会更新Gage_Master表中的估计校准成本(使用同名的表链接到另一个程序的MDB数据存储区),并将Gage_Master表(dbo_Gage_Master)的SQL-Server存储副本中的值更新为只要他们不平等?

很抱歉,如果这是一个已经被问到的问题 - 就像我说的那样,这是一件非常复杂的事情,我想做的最后一件事就是在我的生产数据库中清空我的价格,因为我写错了。在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

不,它甚至不会运行。它是不正确形成的SQL(你有两个在哪里,第二个应该是“和”,你的更新完全不正确,你正在寻找更新)

http://msdn.microsoft.com/en-us/library/ms177523.aspx

非常简单的更新可能如下所示:

UPDATE MyTable
SET MyTable.MyColumn = B.MyOtherColumn
FROM MyOtherTable as B WHERE MyTable.ID = B.ID

这是一个额外的SO帖子,处理这个问题,回答者更深入地了解我在这里。

SQL update from one Table to another based on a ID match

答案 1 :(得分:1)

以这种方式尝试:

UPDATE gm
    SET Est_Calibration_Cost = dgm.Est_Calibration_Cost
    FROM Gage_Master gm
        INNER JOIN dbo_Gage_Master dgm
            ON gm.Gage_ID = dgm.Gage_ID
    WHERE gm.Est_Calibration_Cost <> dgm.Est_Calibration_Cost 

答案 2 :(得分:1)

我假设你正试图在Access中运行它。这将解释您在评论中提到的“缺少运算符”错误 - 访问不理解UPDATE...FROM...。试试这个:

UPDATE dbo_Gage_Master AS dgm INNER JOIN
  Gage_Master AS gm ON dgm.Gage_ID = gm.Gage_ID
SET gm.Est_Calibration_Cost = dgm.Est_Calibration_Cost
WHERE gm.Est_Calibration_Cost <> dgm.Est_Calibration_Cost; 

是的,看起来你可能会以错误的方式更新,因为dgm在联接中排在第一位(它只是按照这种方式计算出来的......)。这是的情况,因为它是确定实际完成更新的SET子句。

答案 3 :(得分:0)

试试这个。在你运行它之前做一个数据库备份或表副本!

UPDATE Gage_Master 
SET Gage_Master.Est_Calibration_Cost = dbo_Gage_Master.Est_Calibration_Cost
FROM dbo_Gage_Master 
    inner join Gage_Master 
    on (Gage_Master.Gage_ID = dbo_Gage_Master.Gage_ID)
WHERE dbo_Gage_Master.Est_Calibration_Cost <> Gage_Master.Est_Calibration_Cost;

如何制作Gage_Master表副本:

select * into Gage_Master_copy from Gage_Master