【问题标题】:Concatenate Rows in Microsoft Access在 Microsoft Access 中连接行
【发布时间】:2013-06-25 08:41:28
【问题描述】:

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

【问题讨论】:

    标签: ms-access concatenation


    【解决方案1】:

    创建一个模块并添加以下代码:

    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;
    

    【讨论】:

    • 那么这条线应该是什么? SQLCmd = "SELECT Product FROM table1 WHERE [Company Name] = """ & company & """" 具体应该把 company 改成什么?另外,“的数量正确吗?
    • 如何为函数添加第二个键?两家公司可以有相同的地址,所以我想确保每个列表都属于一个唯一的公司和地址组合。
    • 只需在函数中添加另一个参数:liststuff(company, address) 然后将该参数添加到您的条件中:WHERE [Company Name] = """ & company & """ AND [Address] = """ & 地址 & """"
    【解决方案2】:

    “我唯一能想到的是我的表的大小(约 290,000 行)可能会使其太慢,但我已经在表上运行了不同的查询而没有问题。” em>

    ConcatRelated() 对数据库引擎施加的工作量比其他查询要大得多。本质上,引擎必须运行单独的查询来收集和连接结果集每一行的相关值。

    如果您怀疑 290K 行是问题的根源,请使用一个小样本表作为数据源来设计和测试您的查询。让查询处理该小表后,将其数据源切换到大表。

    但是我怀疑您还有其他问题。请注意,Browne 先生编写该函数以接受第三个参数 strWhere,而您只为该函数提供了 2 个参数。您似乎要求ConcatRelated() 连接Addresses 表中的所有Product 字段值......并对结果集中的每一行再次进行连接。我不相信那是你真正想要的。

    转到“立即”窗口 (Ctrl+g),然后测试一个表达式,为您提供您想要的单个公司。作为一个疯狂的猜测,也许你需要这样的东西......

    ? ConcatRelated("Product","Addresses", "[Company Name]='Company A'")
    

    找到合适的 ConcatRelated 表达式后,通过传入当前的 [Company Name] 值来调整查询以使用它。

    请注意,如果您的 strWhere 参数包含基于 [Company Name] 字段的条件,则应为该字段编制索引,以便数据库引擎无需执行全表扫描来查找匹配行。

    【讨论】:

    • 我想我只是不太了解 ConcatRelated 的工作原理。为什么我的查询中不需要 Group By 表达式?
    • ConcatRelated 不依赖于主查询中的 GROUP BY。在我看来,一个合适的数据库模式应该有一个单独的表来存储公司名称和地址。因此,您可以将其用作查询的数据源,结果集将包括每家公司的一行,而无需 GROUP BY。如果您没有并且不想创建这样的表,请使用单独的查询:SELECT DISTINCT [Company Name], Address FROM Addresses ... 然后将其用作包含 ConcatRelated 表达式的另一个查询的数据源。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多