连接Microsoft Access中的行

时间:2013-06-27 17:54:28

标签: ms-access concatenation

基本思想是我在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行)的大小可能会使它太慢,但我在桌面上运行了不同的查询而没有问题。

2 个答案:

答案 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引擎无需执行全表扫描即可查找匹配的行