访问SQL选择具有多对多关系的行的值

时间:2018-05-20 15:26:13

标签: sql ms-access many-to-many relationship

我正在使用Access进行食谱数据库,这是Uni的练习。

我试图查询多对多关系。

我有ricetteingredienti个表,以及一个名为ricetta_ingrediente的联结表。现在我应该创建一个查询来检索与使用的ingredienti相关联的每个ricette。

编辑:部分问题已被删除,我需要使用使用的最多成分来检索配方的成分,它是'我必须得到的结果。

每次尝试都会遇到语法错误或空结果 - 我该如何实现此查询?

更多信息

关系架构

[1

我试图实施this suggestion,失败了,应该怎么做?

此处还有我的尝试和访问错误:

[3]

2 个答案:

答案 0 :(得分:1)

使用查询构建器DesignView来帮助构建SQL语句。结果应如下所示:

SELECT ricette.nome, ingredienti.nome
FROM ingredienti 
RIGHT JOIN (ricette RIGHT JOIN ricetta_ingrediente 
            ON ricette.ID = ricetta_ingrediente.id_ricetta) 
ON ingredienti.ID = ricetta_ingrediente.id_ingrediente;

检索含有最多成分和成分的食谱,例如:

SELECT TOP 1 ricette.nome, ingredienti.nome
FROM (SELECT id_ricetta, Count([id_ingrediente]) AS CountIng
      FROM ricetta_ingrediente GROUP BY id_ricetta) AS Q1
RIGHT JOIN (ricette RIGHT JOIN (ingredienti RIGHT JOIN ricetta_ingrediente 
                                ON ingredienti.ID = ricetta_ingrediente.id_ingrediente) 
            ON ricette.ID = ricetta_ingrediente.id_ricetta) 
ON Q1.id_ricetta = ricetta_ingrediente.id_ricetta
ORDER BY Q1.CountIng DESC;

这不会解决关系。所有配料数量与TOP 1计数相匹配的食谱将返回。查询应该如何知道您只需要1和哪一个?

答案 1 :(得分:0)

您的查询没问题。你只需要括号,因为这是MS Access。

我也会使用表别名:

SELECT r.nome, i.nome
FROM (ricette as r INNER JOIN
      ricetta_ingrediente as ri
      ON r.ID = ri.id_ricetta
     ) INNER JOIN
     ingredienti as i
     ON i.ID = ri.id_ingrediente;

编辑:

修改后的问题:

SELECT TOP (1) r.nome
FROM (ricette as r INNER JOIN
      ricetta_ingrediente as ri
      ON r.ID = ri.id_ricetta
     ) INNER JOIN
     ingredienti as i
     ON i.ID = ri.id_ingrediente
GROUP BY r.nome
ORDER BY COUNT(*) DESC;