将行连接成 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的主要内容,如果未能解决你的问题,请参考以下文章