【问题标题】:Access SQL Select value with more rows many to many relationship访问具有更多行的多对多关系的 SQL Select 值
【发布时间】:2018-05-20 15:26:12
【问题描述】:

我正在将 Access 用于食谱数据库,这是 Uni 的一个练习。

我正在尝试查询多对多关系。

我有ricetteingredienti 表,以及一个名为ricetta_ingrediente 的联结表。现在我应该进行一个查询,检索与所用成分相关的每个ricette。

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

每次尝试都会给我一个语法错误或一个空结果 - 我怎样才能实现这个查询?

更多信息

关系模式

[

我尝试实现this suggestion,失败了,应该怎么做?

这也是我的尝试和访问错误:

[

【问题讨论】:

  • 你能提供一些样本数据并期待结果吗?
  • 向我们展示您的架构。以及您编写的查询。以及错误信息。
  • @D-Shih 我正在使用的所有内容都是意大利语,可以吗?出于这个原因,我避免粘贴东西......
  • @nicomp 添加了我的查询和访问错误...
  • 您是否在 SQLView 中键入了此 SQL?如果您改用 DesignView,我希望它看起来会大不相同。您应该将 SQL 发布为文本,而不是图像。还有,英文翻译错误。并按要求提供样本数据。

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


【解决方案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 和哪一个?

【讨论】:

  • 感谢您的回答,我不知道为什么我的部分问题被删除了,我还需要检索包含大多数成分及其成分的收据(所以算了)我猜?),我该怎么做?此连接仅检索所有数据。
  • 我编辑了您的问题,试图使其尽可能简洁明了。您可以再次编辑。正确的翻译是recipe,而不是receipt
  • 哦,好吧 :) 明白了,谢谢,抱歉这个错误。我已经添加了缺失的部分。
  • 查看修改后的答案。由于ricetta_ingrediente 是一个“连接”表,而不是一个“数据透视”表,因此在您的问题中也更正了这一点。
【解决方案2】:

您的查询很好。您只需要括号,因为这是 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;

【讨论】:

  • 感谢您的回答,我不知道为什么我的部分问题被删除了,我还需要检索包含大多数成分的收据(我猜是计数? ), 我怎样才能做到这一点?这个内连接只检索所有数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多