2016-11-22 34 views
2

我对SQL执行顺序有疑问。我在MS-Access中使用嵌套的iif()条件语句,并且由于字符长度变得太长,我想在语句中使用别名。MS Access更新查询反向查询中的表格放置。它为什么有效?

我试过这个(偶然),它的工作原理,我不知道为什么,如果我真的应该使用它。以下是原始格式的缩写示例,与第二种格式相比,使用足够的语句来获取它的要点(使用通用表格名称)。

我想更新upDateMe表。

原始预别名:

UPDATE upDateMe 
INNER JOIN linkMe 
    ON (linkMe.UniqueID = upDateMe.UniqueID) 
AND (linkMe.SrcNumber = upDateMe.SrcNumber) 
SET upDateMe.ExpiryDate = [linkMe].[ExpiryDate] 
    , upDateMe.PermitEnd = [linkMe].[PermitEnd]... 

这里,我已经扭转了表,并把在别名 'BDATA':

UPDATE linkMe 
INNER JOIN upDateMe AS bData 
ON (linkMe.UniqueID = bData.UniqueID) 
AND (linkMe.SrcNumber = bData.SrcNumber) 
SET bData.ExpiryDate = [linkMe].[ExpiryDate] 
    , bData.PermitEnd = [linkMe].[PermitEnd]... 

本次查询的工作??。我不确定为什么会这样。有人可以解释吗?

+0

为什么第二次使用别名? – kbball

+0

@kbballIn MS-Access,我使用查询的例子与长表名(键入不是一个问题)。由于冗长的一组iif()条件(未在我的问题中显示)。我缩短了表名,以便查询可以接受条件。 –

回答

2

因为set语句的左侧始终是什么得到更新。

在代码中(大多数可能不是全部),您可以通过将其设置为右侧的某个值来设置变量。左侧始终是目标。

在这种情况下,您告诉数据库更新linkMe和upDateMe(作为bData)的连接,将bData值设置为linkme值。如果您尝试同时更新bdate和linkMe,您可能会遇到错误,因为引擎一次只能更新1个表,因为此处不存在此类冲突,因此bData更新没有问题。

+0

小增加:不要把这个语句看作是'(UPDATE upDateMe)(INNER JOIN linkMe)',而是'UPDATE(upDateMe INNER JOIN linkMe)'。所以JOIN中表的顺序并不重要,别名也不重要。 @ r.arends – Andre

+0

它基本上是通过内联视图进行更新。 – xQbert

+0

@安德烈谢谢,这是有道理的。 –