[英]MS Access 2013 Concatenate Rows query
我正在寻找用于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:我已经看过其他有关此主题的文章,但是由于这些文章已有多年历史,或者不适合我的情况,所以我正在尝试自己的运气。
考虑以下查询,其中子查询和派生表嵌套在聚合查询中。 内部查询对每个ItemID
的ItemValues
数量进行计数,然后外部查询使用计算出的计数按[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;
OUTPUT
Name Description ItemValues
Testitem This is a test item itemval1;property2val;1234foo
顺便说一下,您的Items
和ItemValues
表似乎类似于Entity-Attribute Value(EAV)模型,其中多个数据项和类型存储在单个列中。 尽管它可以在极端的归一化类型下实现高效存储,但是通常不建议在数据库设计中使用此模型。 请参阅关于此主题的SO帖子: 此处和此处 。 考虑修改后的表架构,以避免将来出现复杂的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.