将行连接成 1 - 访问 2007

Posted

技术标签:

【中文标题】将行连接成 1 - 访问 2007【英文标题】:Concatenate rows into 1 - access 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 个查询执行此操作,所以当它是一种标准时我会有所帮助。

非常感谢!!!!!!!

乔纳斯·罗伦斯

【问题讨论】:

【参考方案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。我的回答非常恰当,但基于幻觉。对不起,我可能惹恼了任何人!

以上是关于将行连接成 1 - 访问 2007的主要内容,如果未能解决你的问题,请参考以下文章

帮助访问 2007 sql 表? [关闭]

使用多个连接将行连接成字符串时遇到问题

SQL 将行连接成一个字段 (DB​​2)

访问 2007 查询以从子查询返回最新日期注释

无法使用 MS Access 2007 访问 ODBC DB

如果一个特定的联接不存在,访问 2007 查询以不切断记录