访问查询 将多对多的记录合并为一行

Access Query Combine Records from Many-to-Many into one row

提问人:Jos 提问时间:8/1/2014 最后编辑:Jos 更新时间:8/4/2014 访问量:321

问:

这应该很容易,但我很难过。

我有一个多对多的关系,例如,许多汽车可以有很多组件。

Don't mind the relationships, this is a screenshot of a query, not the relationships

因此,我想要一个查询来返回所有汽车和使用的后续组件。如果未使用任何组件,则应只返回 NULL 值。

Car | Engine  | Tyre
----------------------
1   | Engine3 |
2   | Engine4 | Tyre3
3   | Engine1 | Tyre1

但是使用以下 SQL:

SELECT Car.idCar, Engine.idEngine, Tyre.idTyre
FROM ((Component 
RIGHT JOIN (Car 
LEFT JOIN Car_Component ON Car.idCar = Car_Component.idCar) ON Component.idComponent = Car_Component.idComponent) 
LEFT JOIN Engine ON Component.idComponent = Engine.idComponent) 
LEFT JOIN Tyre ON Component.idComponent = Tyre.idComponent;

我得到:

Car | Engine  | Tyre
----------------------
1   | Engine3 | 
2   | Engine4 | 
2   |         | Tyre3
3   | Engine1 | 
3   |         | Tyre1

我一直在寻找解决方案很长一段时间了,我很确定我需要进行子查询,但我对子查询的了解有限,我不知道如何开始。

这是 SQL Fiddle 中的问题。

SQL MS-访问

评论


答:

0赞 Linger 8/1/2014 #1

以下查询是否适用于 SQL Fiddle

SELECT DISTINCT Car.idCar, Engine.idEngine, Tyre.idTyre
FROM (((Car 
INNER JOIN Car_Component ON Car.idCar = Car_Component.idCar) 
INNER JOIN Component ON Car_Component.idComponent = Component.idComponent) 
LEFT JOIN Engine ON Component.idComponent = Engine.idComponent)
LEFT JOIN Tyre ON Component.idComponent = Tyre.idComponent;

评论

0赞 Jos 8/1/2014
这不会返回任何记录。
0赞 Linger 8/1/2014
你确定它不起作用吗?我使用这个 SQL Fiddle 对其进行了测试,它返回了我期望的内容。你们有一些可以测试的样本数据吗?
0赞 Jos 8/1/2014
很好,那个 SQL 小提琴。我在那里测试了我的原始查询,它返回了与您的查询相同的内容。我现在肯定责怪 Access。
0赞 Jos 8/4/2014
我注意到您编辑了答案,但您使用的 idComponent 仍然不是唯一的。每个组件(例如 Engine、Tyre)都需要有一个唯一的 idComponent。我稍微编辑了您的 SQL 小提琴以正确表示数据。你能再看一眼吗?