MS Access 2013 Concatenate Rows查询

时间:2015-10-19 16:10:01

标签: sql .net ms-access concatenation ms-access-2013

我正在为MS Access寻找类似 FOR XML PATH('')的内容。

由于我只能读取数据但不能修改访问文件/数据库,因此查询之外的所有内容都不适合我。

一点细节:

我的目标是获得如下所示的查询但可用于MS Access 2013:

SELECT 
    Items.Name, Items.Description , 
    (SELECT ItemValues.Value + ';'
     FROM Itemvalues 
     WHERE Itemvalues.ItemID = [value] 
       AND someOtherConditions
     FOR XML PATH ('') ) AS Values 
FROM 
    Items 
WHERE 
    Items.ID = [value]

如果ItemValue选择的结果类似于

SELECT ItemValues.Value
FROM Itemvalues 
WHERE Itemvalues.ItemID = [value] 
  AND someOtherConditions

输出:

     itemval1
     property2val
     1234foo

项目选择的结果将类似于

SELECT 
    Items.Name, Items.Description 
FROM 
    Items 
WHERE 
    Items.ID = [value]

输出:

 Testitem | This is a test item

我想要一个像

这样的结果行
 Testitem | This is a text test item | itemval1;property2val;1234foo;

感谢您的帮助

PS:我看过其他一些关于这个话题的帖子,但由于这些话要么已经很多年了,要么不适合我的情况,我正在试着运气。

1 个答案:

答案 0 :(得分:2)

考虑以下查询,其中子查询和派生表嵌套在聚合查询中。内部查询计算ItemValuesItemID的数量,然后外部查询按[Name]Description使用计算的计数有条件地聚合,以输出项目值的串联字符串。

不幸的是,您需要为要连接的每个值显式添加Max(IIF(...)个查询语句,如下所示,仅使用示例中的三个。见省略号。

请注意:此解决方案假设您在ID表中有一个主要的自动编号[ItemValues]字段:

SELECT Items.Name, Items.Description,
       Max(IIF(ItemCount=1, t1.Value, NULL)) & ';' &  
       Max(IIF(ItemCount=2, t1.Value, NULL)) & ';' & 
       Max(IIF(ItemCount=3, t1.Value, NULL)) 
       ... As ItemValues       
FROM(
     SELECT Items.Name, Items.Description, t1.Value,
            (SELECT Count(*) FROM ItemValues t2 
             WHERE t1.ItemID = t2.ItemID AND t1.ID >=t2.ID) As ItemCount
     FROM Items INNER JOIN ItemValues t1 ON Items.ID = t1.ItemID
) As derivedTable
GROUP BY Items.Name, Items.Description;

<强>输出

Name        Description            ItemValues
Testitem    This is a test item    itemval1;property2val;1234foo

顺便说一句,您的ItemsItemValues表似乎类似于Entity-Attribute Value (EAV)模型,其中多个数据项和类型存储在一个列中。虽然它可以在极端类型的标准化中实现高效存储,但通常不建议在数据库设计中使用此模型。请参阅有关主题的SO帖子:herehere。考虑一个修订的表模式,以避免复杂的查询。