MS Access连接表的多个实例

时间:2018-07-20 15:06:52

标签: sql ms-access

我正在尝试针对我为一家矿业公司收集的一组数据进行报告。

每天,一个采矿项目都会从其矿山和工厂发送数据。数据由三组读数组成:读数,当天的计划以及每月目标是多少。每月目标保持一个月不变,但每日目标通常保持不变,但在特殊情况下可以更改。

所以我制作了一个铣削和采矿的读数表,并将3个实例合并到采矿/铣削报告中。

这是我的数据库的关系图:

relationships

现在,我想计算每次读数获得的百分比。因此,我需要获取生产读数,并将其除以等效的每日目标。

问题是,我对SQL和Access相当陌生

我仍然想尝试将3个读数表合并用于单个报表的挖掘/铣削。 我已经尝试过了:

SELECT Rapport_quotidien.ID_rapport,
       Données_mine.*,
       Données_mine_1.*,
       Données_mine_2.*,
       Données_moulin.*,
       Données_moulin_1.*,
       Données_moulin_2.*
FROM Données_mine AS Données_mine_1,
     Données_mine AS Données_mine_2,
     Données_moulin AS Données_moulin_1,
     Données_moulin AS Données_moulin_2, (Données_moulin
INNER JOIN Rapport_moulin ON (Données_moulin.ID_data_moulin = Rapport_moulin.Cible_quotidienne)
      AND (Données_moulin.ID_data_moulin = Rapport_moulin.Usinage)
      AND (Données_moulin.ID_data_moulin = Rapport_moulin.Cible_mensuelle))
INNER JOIN ((Données_mine
INNER JOIN Rapport_minier 
        ON (Données_mine.ID_data_mine = Rapport_minier.Production)
       AND (Données_mine.ID_data_mine = Rapport_minier.cible_quotidienne)
       AND (Données_mine.ID_data_mine = Rapport_minier.cible_mensuelle))
INNER JOIN Rapport_quotidien ON Rapport_minier.ID_minier = Rapport_quotidien.Minier) 
        ON Rapport_moulin.ID_moulin = Rapport_quotidien.Moulin
WHERE (((Rapport_quotidien.ID_rapport)=[ID du rapport:]));

它为我提供了正确的字段,但是即使我有要测试的数据也没有数据。 这是设计模式下的样子:design

3 个答案:

答案 0 :(得分:0)

您必须使用以下格式:

FROM ((MyTable MyTable1
INNER JOIN MyTable MyTable2 ON [links between MyTable1 and MyTable2])
INNER JOIN MyTable MyTable3 ON [links between MyTable1 or MyTable2 and MyTable3])
INNER JOIN OtherTable ON [links between MyTable1 or MyTable2 or MyTable3 and OtherTable]

或这个

FROM (((RootTable
INNER JOIN SubTable SubTable1 ON [links between RootTable and SubTable1])
INNER JOIN SubTable SubTable2 ON [links between RootTable and SubTable2])
INNER JOIN SubTable SubTable3 ON [links between RootTable and SubTable3])
INNER JOIN OtherTable ON [links between RootTable and OtherTable]

您可能需要OUTER而不是INNER ones的联接,在这种情况下,请务必考虑到丢失的记录

答案 1 :(得分:0)

考虑在查询构建中从父表开始向下。并且由于该查询使用许多表,因此请使用MS Access的GUI设计,其中应将表仔细排列并检查每一步的结果。由于您具有联接关系,因此添加表会自动设置INNER JOIN ON子句。

  1. 首先,从 Report_Quotidien (所有联接的基本来源)开始。
  2. 然后,添加 Rapport_minier 。检查结果。
    • 然后,依次一张Données表。检查结果。
  3. 然后,添加 Rapport_moulin 。检查结果。
    • 然后,将其Données表一一添加。检查结果。

如果检查结果之一产生零记录,那么您确定了导致该问题的表。我的猜测是,由于记录未完全对齐,您可能需要在所有链接上使用LEFT JOIN而不是INNER JOIN。同样,请在GUI设计器中逐步进行此操作。


另一种方法是构建子查询,米尔查询(没有主 Report_Quotidien 表),然后将这些查询加入主数据库查询。还要注意使用表别名来减少长名称的长度:

SELECT mn.*, ml.*
FROM (Report_Quotidien r
LEFT JOIN MineQuery mn ON mn.ID_minier = r.Minier)
LEFT JOIN MillQuery ml ON ml.ID_moulin = r.Moulin

MineQuery (让UI设计人员设置链接字段,但将连接调整为LEFT)

SELECT mine.*, d.*. d1.*, d2.*
FROM ((Rapport_minier mine
LEFT JOIN Données_mine d    ON d.ID_data_mine = mine.cible_quotidienne)
LEFT JOIN Données_mine_1 d1 ON d1.ID_data_mine = mine.cible_mensuelle)
LEFT JOIN Données_mine_2 d2 ON d2.ID_data_mine = min.Production

MillQuery (让UI设计人员设置链接字段,但将联接调整为LEFT)

SELECT mill.*, d.*. d1.*, d2.*
FROM ((Rapport_moulin mill
LEFT JOIN Données_moulin d ON d.ID_data_moulin = mill.cible_mensuelle)
LEFT JOIN Données_moulin_1 ON d1.ID_data_moulin = mill.Cible_quotidienne)
LEFT JOIN Données_moulin_2 ON d2.ID_data_moulin = mill.Usinage

答案 2 :(得分:0)

最后,我要做的就是在GUI中重新定义Join关系。我将Rapport_minier.cible_quotidienne链接到Données_mine_1,将Rapport_minier.cible_mensuelle链接到Données_mine_2,将Rapport_moulin.cible_quotidienne链接到Données_moulin_1,将Rapport_moulin.cible_mensuelle链接到Données_moulin_2。

Solved query in GUI

这使查询变得如此混乱:

SELECT Rapport_quotidien.ID_rapport, Données_mine.*, Données_mine_1.*, Données_mine_2.*, Données_moulin.*, Données_moulin_1.*, Données_moulin_2.*
FROM Données_moulin AS Données_moulin_2 
INNER JOIN (Données_moulin AS Données_moulin_1 
INNER JOIN (Données_moulin 
INNER JOIN (Rapport_moulin 
INNER JOIN ((Données_mine AS Données_mine_2 
INNER JOIN (Données_mine AS Données_mine_1 
INNER JOIN (Données_mine 
INNER JOIN Rapport_minier ON Données_mine.ID_data_mine = Rapport_minier.Production) 
ON Données_mine_1.ID_data_mine = Rapport_minier.cible_quotidienne) 
ON Données_mine_2.ID_data_mine = Rapport_minier.cible_mensuelle) 
INNER JOIN Rapport_quotidien ON Rapport_minier.ID_minier = Rapport_quotidien.Minier) 
ON Rapport_moulin.ID_moulin = Rapport_quotidien.Moulin) 
ON Données_moulin.ID_data_moulin = Rapport_moulin.Usinage) 
ON Données_moulin_1.ID_data_moulin = Rapport_moulin.Cible_quotidienne) 
ON Données_moulin_2.ID_data_moulin = Rapport_moulin.Cible_mensuelle
WHERE (((Rapport_quotidien.ID_rapport)=[Rapport à chercher]));