在ms-access中是否有group_concat函数?

时间:2010-05-17 21:20:11

标签: sql mysql ms-access

是ms-access中的group_concat函数还是类似的东西?

4 个答案:

答案 0 :(得分:3)

您应该问自己是否需要通用解决方案(another is by Allen Browne),或者只是为了本目的而需要它。如果你真的只需要这一次,那么就这么简单。

另一方面,当在VBA代码中连接列表时,请利用长期访问大师Trevor Best向我讲授的技巧,并将分隔符粘贴在每个值的开头,然后使用Mid()脱掉它。而不是通过子记录循环内部:

  If Len(strOutput) = 0 Then
     strOutput = NewValue
  Else
     strOutput = strOutput & ", " & NewValue
  End If

...在循环中使用它:

  strOutput = strOutput & ", " & NewValue

...然后当你退出循环时,剥去前导分隔符:

  strOutput = Mid(strOutput, 3)

这对整个地方都有影响,并简化了在大量环境中连接的代码。

答案 1 :(得分:2)

我发现Duane Hookum(微软MVP)的this post声称能够做你想做的事。我没有测试过它。


顺便说一句,如果您感兴趣,我就是这样找到的:

首次搜索:group_concat access通过this post this answer引导我the link was broken,但site:http://www.rogersaccesslibrary.com/ concatenate

然后我在答案试图链接到的内容后再次搜索,并找到它:{{3}}。

答案 2 :(得分:1)

没有。 Access没有GROUP_CONCAT函数。但是,可以创建一个VBA函数,它允许您传递包含SQL语句的字符串并获得相同的功能(不是我推荐它,但它是可能的)。

采用我自己的个人回程机器,这是我在恐龙统治地球时写回的一些代码:

Public Function ListQuery(SQL As String _
                            , Optional ColumnDelimiter As String = " " _
                            , Optional RowDelimter As String = vbCrLf) As String
'PURPOSE: to return a combined string from the passed query
'ARGS:
'   1. SQL is a valid Select statement
'   2. ColumnDelimiter is the character(s) that separate each column
'   3. RowDelimiter is the character(s) that separate each row
'RETURN VAL:
'DESIGN NOTES:

Const PROCNAME = "ListQuery"
Const MAXROWS = 100
Const MAXCOLS = 10
Dim oConn As ADODB.Connection
Dim oRS As ADODB.Recordset
Dim oField As ADODB.Field
Dim sRow As cString
Dim sResult As cString

On Error GoTo ProcErr

Set sResult = New cString
Set sRow = New cString
Set oConn = GetADOConn()

sResult.Clear
Do Until oRS.EOF
    sRow.Clear

    For Each oField In oRS.Fields
        With sRow
            If .Length > 0 Then
                .Append ColumnDelimiter
            End If

            .Append Nz(oField.Value)
        End With
    Next oField

    sRow.Trim
    If sRow.Length > 0 Then
        With sResult
            .Append sRow
            .Append RowDelimter
        End With
    End If

    oRS.MoveNext
Loop
oRS.Close
oConn.Close

With sResult
    If .Right(Len(RowDelimter)).Value = RowDelimter Then
        .Length = .Length - Len(RowDelimter)
    End If
End With

FunctionResult:
    ListQuery = sResult.Value

CleanUp:
    Set sResult = Nothing
    Set sRow = Nothing
    Set oField = Nothing
    Set oRS = Nothing
    Set oConn = Nothing

Exit Function
ProcErr:
    ' logging  code...
    Resume CleanUp

End Function

GetADOConn函数是一个集中函数,用于检索当前数据库连接。 cString是一个模仿.NET StringBuilder类行为的类,但是在.NET不是TLD和营销宣传之前很久就编写过了。由于这是在每一行调用,VBA的内置字符串连接将很慢,因此需要类似StringBuilder类的东西。原始代码(我已经部分修改过了)对可以使用的行数和列数有一个限制,这就是常量的全部内容。

答案 3 :(得分:1)

有一个访问功能可以将多个值组合成一个值(我想是一个自定义聚合。)链接是http://www.rogersaccesslibrary.com/Otherdownload.asp?SampleName='Generic%20Function%20To%20Concatenate%20Child%20Records'

但该网站暂时停止运营。如果你谷歌href,你会发现很多参考和例子。