【问题标题】:Concatenate rows into 1 - access 2007将行连接成 1 - 访问 2007
【发布时间】:2009-12-17 09:42:14
【问题描述】:

我正在 Access 2007 中创建一个数据库,目前我正在为查询而苦苦挣扎。仅在一列中,可以包含多个答案。因此,当我打开查询时,给出 3 个答案时我得到 3 行。我想将这些行连接成一个。有时没有答案,有时 1 或 2 或最多 3 个。

目前我的查询如下所示:

列名:B - Latijnse benaming(空格) B - Nederlandse benaming(空格) Bloemen.B - April 2.Value(空格) B - Klas(空格) - B - Leerkracht(空格) B - 定位

ROW 1 Abelmochus(空格)(空格)Zaaien(空格)1ATA(空格)Depuydt(空格)Serre 1

ROW 2 Abelmochus(空格)(空格)Oogsten(空格)1ATA(空格)Depuydt(空格)Serre 1

ROW 3 Abelmochus(空格)(空格)Bemesten(空格)1ATA(空格)Depuydt(空格)Serre 1

我想要它看起来像这样:

ROW 1 Abelmochus(空格)(空格)Zaaien、Oogsten、Bemesten(空格)1ATA(空格)Depuydt(空格)Serre 1

tbl 被称为 Bloemen,这是目前查询的 SQl:

  SELECT Bloemen.[B - Latijnse benaming], Bloemen.[B - Nederlandse benaming], Bloemen.[B - April 2].Value, Bloemen.[B - Klas], Bloemen.[B - Leerkracht], Bloemen.[B - Locatie]
  FROM Bloemen
  WHERE (((Bloemen.[B - April 2].Value) Is Not Null));

谁能帮我把这些行连接成一个。我不知道如何编写 SQL...我必须为 48 个查询执行此操作,所以当它是一种标准时我会有所帮助。

非常感谢!!!!!!!

乔纳斯·罗伦斯

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    怎么样:

    下面的代码示例将从 SQL 或字符串输入返回一个分隔列表。这是在查询中使用它的方法:

       SELECT documents.MembersOnly, 
           ConcatList("SELECT FName From Persons WHERE Member=True",":") AS Who, 
           ConcatList("",":","Mary","Joe","Pat?") AS Others
       FROM documents;
    

    或者

       SELECT tc.Company, 
              ConcatList("SELECT Contract 
                          FROM tblservices 
                          WHERE CompanyKey=" & tc.[CompanyKey],", ") AS Contracts
       FROM tblCompanies tc
    

    示例代码

       Function ConcatList(strSQL As String, strDelim, _
                ParamArray NameList() As Variant)
       ''Reference: Microsoft DAO x.x Object Library
       Dim db As Database
       Dim rs As DAO.Recordset
       Dim strList As String
    
       Set db = CurrentDb
    
       If strSQL <> "" Then
           Set rs = db.OpenRecordset(strSQL)
    
           Do While Not rs.EOF
               strList = strList & strDelim & rs.Fields(0)
               rs.MoveNext
           Loop
    
           strList = Mid(strList, Len(strDelim) + 1)
       Else
    
           strList = Join(NameList, strDelim)
       End If
    
       ConcatList = strList
    
       End Function
    

    发件人:http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29


    上面的链接现在包含下面的 ADO 版本,我在这里将其包含为 @onedaywhen 从未添加过版本。

    这更快更容易,但对字段(列)名称更加敏感。您需要确保它们不是保留字。 ADO 版本的另一个优点是您不受要连接的列数的限制:

    SELECT d.DeptID, d.Department, 
           ConcatADO("SELECT FName & ' ' & SName, Address FROM Persons 
                     WHERE DeptID=" & [d].[DeptID],", "," : ") AS Who
    FROM Departments AS d INNER JOIN Persons AS p ON d.DeptID = p.DeptID
    GROUP BY d.DeptID, d.Department, 3;
    
    Function ConcatADO(strSQL As String, strColDelim, _
             strRowDelim, ParamArray NameList() As Variant)
    Dim rs As New ADODB.Recordset
    Dim strList As String
    
    On Error GoTo Proc_Err
    
       If strSQL <> "" Then
           rs.Open strSQL, CurrentProject.Connection
           strList = rs.GetString(, , strColDelim, strRowDelim)
           strList = Mid(strList, 1, Len(strList) - Len(strRowDelim))
       Else
           strList = Join(NameList, strColDelim)
       End If
    
       ConcatADO = strList
    
    Exit Function
    
    Proc_Err:
        ConcatADO = "***" & UCase(Err.Description)
    End Function
    

    【讨论】:

    • ADODB 记录集已内置支持此功能,例如strList = rs.GetString(RowDelmeter:=strDelim)
    • @onedaywhen:为什么不将 ADODB 建议作为单独的答案?这是一个非常好的主意,也是 ADO 提供 DAO 所缺乏的有用东西的案例之一。
    • 我以前和@Remou 一起来过这里:如果我编辑@Remou 的答案以添加ADO 答案,他会生气并回滚;如果我发布新答案,@Remou 会表示不满并投反对票。另一方面,评论不能被否决或编辑。这不是我想要的方式,但这就是它与某些人的关系:(
    • @onedaywhen 你误会我了。我不会否决新答案,我很少投反对票(
    • 我没有建议编辑——我说要发布一个单独的答案。
    【解决方案2】:

    我认为“标准”SQL 不会这样做。 Access 中可能有一些功能可以返回包含列值的数组...但除非其他人根据这种功能提出很酷的建议,否则我会说“不”。

    这种处理通常必须在调用 SQL 的编程环境中完成。您是在使用某种报告生成器,例如 BIRT,还是在做“直接”的 JDBC?如果是后者,那么您可以简单地循环遍历您的 ResultSet 以将该复合列放在一起。

    【讨论】:

    • 感谢您的回答,但我仍然不清楚如何解决这个问题......我在这个网站上发现了其他问题,这些问题有点相似,但我的问题似乎有点不同(对我来说) .
    • Remou 的回答实现了我所说的,虽然语言很糟糕;)如果您需要帮助“看到”Java 中的内容,请给我们留言,有人会为您翻译。
    • +1 不仅标准 SQL 没有连接集函数,而且 Access 数据库引擎也没有,而且有充分的理由......
    • @Carl Smotric:您可能不喜欢 VBA,但如果用户在 Access 中工作,这是显而易见的选择。鉴于最初的问题是“我在 Access 2007 中创建数据库”,显然 VBA 是最适合编写解决方案的语言。
    • @David W Fenton:糟糕,我的错。我确定我在问题文本的某处看到了“Java”。我记得我认为有人从 Java 访问 Access 有点不寻常,但无论如何都决心帮助他。出于同样的原因,我认为他可能不懂 VBA。我的回答非常恰当,但基于幻觉。对不起,我可能惹恼了任何人!
    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多