【问题标题】:MS Access 2013 Concatenate Rows queryMS Access 2013 连接行查询
【发布时间】:2016-01-18 01:54:23
【问题描述】:

我正在为 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:我看过一些关于这个主题的其他帖子,但由于这些帖子已经有很多年了,或者不适合我的情况,所以我正在试试运气。

【问题讨论】:

  • 我看到您在这个问题中添加了.net 标签。您打算在什么环境中运行此查询? C#? VB.NET? ...?
  • @GordThompson 我将在 c# 中使用这个查询

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


【解决方案1】:

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

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

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

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。考虑修改表架构以避免复杂的查询。

【讨论】:

  • 感谢您的广泛回答,但由于我不知道我会得到多少价值,我认为我不能这样做,我也不认为我会被允许这样做当我什至不允许添加模块时更改他们的数据库结构
  • 您可以预先计算这些值,然后相应地添加Max(IIF(... 行。甚至 VBA 也可以提供帮助,因为它可以使用跨项目的循环来创建 querydef。
  • 是的,你说得对,我将首先查询 ItemValues,然后构建我的实际查询以获取数据。而不是在循环中使用循环............
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多