为什么Access有时会在查询默认列别名中包含源表名?

时间:2017-05-22 21:21:41

标签: sql ms-access

我偶尔会有一个查询 Access坚持自动为每个列添加源表/查询名称前缀。向源添加别名没有帮助 - 该别名只是每个返回的列名称的前缀。它有时会发生在只有一个源的情况下,因此没有可能出现冲突的列名,但我也在多个表的连接中观察到它。

在设计视图中创建或编辑简单查询时,可以从源表(或查询)中选择列,而无需指定显式别名。正如人们所料,返回的列假定源列的名称(没有其他限定符 - 通常没有表名称作为列名称的前缀)。当连接表具有相同名称的列时,即使在查询中只选择了一个可能存在冲突的列,也是如此。

[Products]和[Details]都有[ID]列的示例:

SELECT Products.ID, Products.ItemName, Details.Description
FROM Products INNER JOIN Details ON Products.ID = Details.ForeignID

这些栏目中的结果

| ID | ItemName | Description |

如果默认列名称冲突,则Access会自动为结果列名称添加前缀源表,但仅针对彼此冲突的特定列

SELECT Products.ID, Products.ItemName, Details.ID, Details.Description
FROM Products INNER JOIN Details ON Products.ID = Details.ForeignID

这些栏目中的结果

| Products.ID | ItemName | Details.ID | Description |

(有趣的是,在显式列别名中不允许使用句点,但带有句点的自动带前缀的名称即使在后续查询中也能正常工作。)

如果编辑和保存SQL而不允许设计视图再次将其删除,则通常可以通过从SELECT子句中删除源引用(例如SELECT Details.Description - > SELECT Description。 (显式别名也像SELECT Details.Description As Description一样,但这确实超出了我的问题,因为我想知道为什么Access似乎会自动随机添加源前缀 。)

这是我最近的查询,展示了这种烦人的默认行为。我无法看到任何应该导致此问题的保留名称或查询的其他功能......正如我已经提到的,我可以删除所有Detail.次出现,并且它适用于简单的列名:

SELECT Detail.[Board Order], Detail.[Sales Rep], Detail.[Sales Team], Detail.[Sales Year],
  Detail.[Team Name], Detail.[Date of Service], Detail.[Service Year],
  Detail.[Service Month], Detail.[Service Week], Detail.[Service Codes],
  Detail.Account, Detail.[Last Name], Detail.[First Name],
  Detail.AsOfDate
FROM [Rep Completed IS Detail As Of] AS Detail
WHERE (((Detail.[Service Year])=Year([Detail].[AsOfDate])) 
  AND ((Detail.[Service Week])=DatePart("ww",[Detail].[AsOfDate])))

这些栏目中的结果

| Detail.Board Order | Detail.Sales Rep | Detail.Sales Team | ...

我无法找出这种行为的模式。有谁知道何时/为何会发生这种情况?

0 个答案:

没有答案