2

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

4

2 回答 2

3

Create a module and add the following code:

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

You may need to change the database values to your actual table name and field names.

In your query use:

SELECT Table1.[Company Name], Table1.Address, Liststuff([Company Name]) AS [List of Products]
FROM Table1
GROUP BY Table1.[Company Name], Table1.Address;
于 2013-06-28T05:40:25.113 回答
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]字段的条件,则应为该字段编制索引,以便数据库引擎无需执行全表扫描来查找匹配行。

于 2013-06-27T18:27:49.293 回答