我偶尔会有一个查询 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 | ...
我无法找出这种行为的模式。有谁知道何时/为何会发生这种情况?