女士访问查询:通过查询连接行

假设我在Ms Access中有以下信息:

ColumnA ColumnB 1 abc 1 pqr 1 xyz 2 efg 2 hij 3 asd 

我的问题是,如何将第二列中的值连接到基于第一列的行值。 我想要的查询结果如下:

 ColumnA ColumnB 1 abc, pqr, xyz 2 efg, hij 3 asd 

我想通过查询来实现这一点。 有人能帮我达到这个目标吗?

你需要一个函数来进行连接。

Microsoft Access压缩表中的多行

使用您的数据的示例:

 Select T.ColumnA , GetList("Select ColumnB From Table1 As T1 Where T1.ColumnA = " & [T].[ColumnA],"",", ") AS ColumnBItems From Table1 AS T Group By T.ColumnA; 

这里有一个优秀的链接:如何通过调用一个函数从SQL内部做到这一点。 说明非常清楚,function是为你写的,所以你可以复制,粘贴和去。 即使是不了解VB的人也可以很容易地实现它: 连接相关logging的值

这可能是非常难以获得的。 如果你必须在查询中而不是函数中执行,那么你将遇到的问题是可以连接成一列的行数的限制。 到目前为止,我发现实现这一目标的唯一方法是通过iif语句。

 SELECT test1.ColumnA AS ColumnA, First([test1].[ColumnB]) & IIf(Count([test1].[ColumnB])>1,"," & Last([test1].[ColumnB])) AS ColumnB FROM test1 GROUP BY test1.ColumnA; 

收益:

 ColumnA ColumnB 1 abc,xyz 2 efg,hij 3 asd 

这将只返回第一个和最后一个,但我相信有一点工作,你可以计算出Choose函数,但正如我所说,你将不得不添加更多的iif语句为每个你想添加的项目,因此局限性。

该表可以有一个序列列,它为ColumnA序列提供一个唯一的主键:

 table: t1 ColumnA sequence ColumnB 1 1 abc 1 2 pqr 1 3 xyz 2 1 efg 2 2 hij 3 1 asd 

并且可以创build一个交叉表:

 query: x1 TRANSFORM Min([columnB] & ", ") AS Expr1 SELECT t1.columnA FROM t1 GROUP BY t1.columnA PIVOT t1.sequence; columnA 1 2 3 1 abc, pqr, xyz, 2 efg, hij, 3 asd, 

然后最后一个查询可以合并列并删除最后一个逗号:

 SELECT x1.columnA, Left([1] & [2] & [3],Len([1] & [2] & [3])-2) AS columnB FROM x1; columnA columnB 1 abc, pqr, xyz 2 efg, hij 3 asd 

要自动填充序列,可以使用以下VBA代码:

 Sub fill_sequence_t1() Dim i: i = 1 Do While DCount("*", "t1", "sequence IS NULL") > 0 DoCmd.RunSQL "SELECT t1.columnA, Min(t1.columnB) AS columnB_min INTO t2" & _ " FROM t1 WHERE t1.sequence IS NULL GROUP BY t1.columnA;" DoCmd.RunSQL "UPDATE t1 INNER JOIN t2 ON (t1.columnA = t2.columnA)" & _ " AND (t1.columnB = t2.columnB_min) SET t1.sequence=" & i CurrentDb.TableDefs.Delete "t2" i = i + 1 Loop End Sub