我正在为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:我看过其他一些关于这个话题的帖子,但由于这些话要么已经很多年了,要么不适合我的情况,我正在试着运气。答案 0 :(得分:2)
考虑以下查询,其中子查询和派生表嵌套在聚合查询中。内部查询计算ItemValues
每ItemID
的数量,然后外部查询按[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
顺便说一句,您的Items
和ItemValues
表似乎类似于Entity-Attribute Value (EAV)模型,其中多个数据项和类型存储在一个列中。虽然它可以在极端类型的标准化中实现高效存储,但通常不建议在数据库设计中使用此模型。请参阅有关主题的SO帖子:here和here。考虑一个修订的表模式,以避免复杂的查询。