好吧,我的Access 2007数据库中有两个表(好吧,不止于此,但问题适用于这两个......):
part
part_no
...
supplier_id
special_supplier_id
...
和
supplier
supplier_id
supplier_nm (NB: Caption="Supplier Name")
special_supplier_flg
现在我已经构建了一个查询:
SELECT p.part_no, s.supplier_nm, ss.supplier_nm AS special_supplier_nm
FROM
part AS p INNER JOIN
supplier AS s ON p.supplier_id = s.supplier_id INNER JOIN
supplier AS ss on p.supplier_id = ss.supplier_id
一切都很好,它似乎适用于简单的选择(如果查询本身有任何错误,它是为问题重新输入它的工件,而不是什么问题是的,并且也应该适用于代码应用程序。
问题是,如果我打开查询的数据表视图,则两个名称字段都标记为“供应商名称”。有没有办法解决这个问题?
答案 0 :(得分:3)
对于单表查询,我在Access 2003中看到了同样的事情......如果源字段分配了标题,则该标题将用作查询数据表视图中的列标题,无论是否我在查询定义中为字段指定别名。
除了从源表定义中删除Caption之外,我可以找到解决它的唯一方法是手动使用VBA重新分配字段的Caption属性。 Query1包含一个名为id的字段,该字段在源表中具有“Foo ID”作为其标题:
CurrentDb.QueryDefs("Query1").Fields("id").Properties("Caption") = "foo_id"
该命令确实导致查询数据表视图使用foo_id作为列标题。
如果为查询字段分配别名,则该别名将用作查询字段集合中的名称。您可以使用以下过程检查查询的字段名称及其标题:
Public Sub InspectQueryFieldCaptions(ByVal pQuery As String)
Dim fld As DAO.Field
Dim strMsg As String
On Error GoTo ErrorHandler
For Each fld In CurrentDb.QueryDefs(pQuery).Fields
Debug.Print "Field: " & fld.Name, "Caption: " & fld.Properties("Caption")
Next fld
ExitHere:
Set fld = Nothing
On Error GoTo 0
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 3270 ' Property not found. '
Debug.Print "Field: " & fld.Name, "no caption"
Resume Next
Case Else
strMsg = "Error " & Err.Number & " (" & Err.Description _
& ") in procedure InspectQueryFieldCaptions"
MsgBox strMsg
GoTo ExitHere
End Select
End Sub
答案 1 :(得分:2)
试试这个:
SELECT p.part_no, s.supplier_nm, (ss.supplier_nm + '') AS special_supplier_nm. . .
但是,如果您正在使用查询构建器,则可能需要注意不要首先使用“默认”别名(来自标题)构建查询,因为这似乎会隐藏在某些不可见的元数据中。
此外,如果您可以在Access'查询构建器中编辑此查询,如果您右键单击相关字段,则可以选择在查询中设置标题属性,这将覆盖原始表上的任何标题列。
答案 2 :(得分:0)
您的表定义中是否设置了标题?这些定义将显示而不是您的别名。由于您选择的列具有相同的标题(不管别名),您将在数据表视图中看到相同的标题。
您是否可以选择更改字幕字段?将其留空将使用其给定的名称(或视图中的别名)
答案 3 :(得分:0)
工作的替代方法
好的,这个让我疯狂,因为我使用来自我们公司的财务,人力资源和客户关系管理系统的链接(导入)表格中的大量数据,这些数据都是由同一个开发人员设置的,他们认为每个索引都标题为“ID:”是一个好主意。但是当你有一个聚合时,会把很多这些聚集在一起,你会得到一个很大的错误,因为后续的查询无法解决哪个“ID:”就是哪个。他是我的解决方案:
而不是简单地传递值,只是简单地传递标题:如果要重新标题的字段是值字段,只需重新标记它并将其乘以1就像这样(在我的per_id字段中是标题ID:):
Perid: 1*[pe_id]
这会产生一个标记为Perid的新字段
如果它是一个文本字段,只需将它连接起来就像这样:
Perid: ""&[fname]
有效。