基本思想是我在Access 2007中有一个表格:
Company Name | Address | Product
Company A 123 Fakestreet Phone
Company A 123 Fakestreet Computer
Company A 123 Fakestreet Car
Company B 456 Fakestreet Football
Company B 456 Fakestreet Basketball
Company B 456 Fakestreet Golf Ball
我希望它采用这种形式:
Company Name | Address | List of Products
Company A 123 Fakestreet Phone, Computer, Car
Company B 456 Fakestreet Football, Basketball, Golf Ball
我尝试使用Allen Browne的ConcatRelated函数(http://allenbrowne.com/func-concat.html),起初它不起作用,因为我忘了启用VBA内容。我做到了,现在Access只是一直冻结而没有响应。我使用了下面的查询(表的名称是地址)。我遗漏了列地址只是为了看看我是否可以让它工作,然后我会把它放回去。:
SELECT Company_Name, ConcatRelated("Product","Addresses")
FROM Addresses;
有人看到它有什么问题吗?我唯一能想到的是我的表(~290,000行)的大小可能会使它太慢,但我在桌面上运行了不同的查询而没有问题。
答案 0 :(得分:2)
创建模块并添加以下代码:
Function liststuff(company)
Dim curr As Database
Dim rs As Recordset
Dim SQLCmd As String
Dim productList As String
Set curr = CurrentDb()
SQLCmd = "SELECT Product FROM table1 WHERE [Company Name] = """ & company & """"
Set rs = curr.OpenRecordset(SQLCmd)
If Not rs.EOF Then
rs.MoveFirst
End If
Do While Not rs.EOF
productList = productList & rs(0) & ", "
rs.MoveNext
Loop
liststuff = productList
End Function
您可能需要将数据库值更改为实际的表名和字段名。
在您的查询中使用:
SELECT Table1.[Company Name], Table1.Address, Liststuff([Company Name]) AS [List of Products]
FROM Table1
GROUP BY Table1.[Company Name], Table1.Address;
答案 1 :(得分:1)
“我唯一能想到的是我的表格大小(约290,000行)可能会使它太慢,但我在桌面上运行不同的查询而没有问题。”
ConcatRelated()
在数据库引擎上施加的工作量远远大于其他查询。本质上,引擎必须运行单独的查询来收集和连接结果集的每一行的相关值。
如果您怀疑290K行是问题的根源,请使用小样本表作为其数据源来设计和测试您的查询。一旦您使用该小表获得查询,请将其数据源切换到大表。
但是我怀疑你还有另外一个问题。请注意,Browne先生写了这个函数来接受第三个参数 strWhere ,并且你只为函数提供了2个参数。您似乎要求ConcatRelated()
连接Product
表中的所有Addresses
字段值...并再次对结果集中的每一行进行连接。我不相信这就是你真正想要的。
转到立即窗口( Ctrl + g ),然后测试表达式,为您提供单个公司所需的内容。作为一个疯狂的猜测,也许你需要这样的东西......
? ConcatRelated("Product","Addresses", "[Company Name]='Company A'")
找出合适的ConcatRelated
表达式后,请调整查询以通过传入当前[Company Name]
值来使用它。
请注意,如果 strWhere 参数包含基于[Company Name]
字段的条件,则应对该字段建立索引,以便db引擎无需执行全表扫描即可查找匹配的行