【问题标题】:Issue with access inner join访问内部联接的问题
【发布时间】:2013-07-03 00:49:39
【问题描述】:

我不断收到有关此特定语句的语法错误。

SELECT tbl1.ProjectID, tbl1.EntryDate AS StartDate, tbl2.EntryDate AS EndDate, 
(tbl3.ChecklistDayMax - tbl3.ChecklistDayMin + 1) AS DaysAllotted, 
(SELECT ProjectPriority FROM project_master WHERE ProjectID = tbl1.ProjectID) AS Priority,
tbl3.MilestoneName,
IIF(Priority = 1, tbl3.BonusDaysFH, 
IIF(Priority = 2, tbl3.BonusDaysFM, 
IIF(Priority = 3, tbl3.BonusDaysFL))) AS BonusDaysAllotted
FROM (((checklist_entries AS tbl1
INNER JOIN checklist_entries AS tbl2 ON tbl1.ProjectID = tbl2.ProjectID)
INNER JOIN milestone_def AS tbl3 ON [@milestoneID] = milestone_def.MilestoneDefID)
INNER JOIN project_active_status AS tbl4 ON tbl1.ProjectID = project_active_status.ProjectID)
WHERE tbl1.ChecklistDay = tbl3.ChecklistDayMin
AND tbl2.ChecklistDay = tbl3.ChecklistDayMax
AND tbl4.ProjectIsOpen = FALSE;

错误提示 连接操作中的语法错误,然后在第二次 INNER JOIN 之后突出显示里程碑_def。有趣的是,如果我切换这条线......

INNER JOIN milestone_def AS tbl3 ON [@milestoneID] = milestone_def.MilestoneDefID)

用这条线...

INNER JOIN milestone_def AS tbl3 ON [@milestoneID] = tbl3.MilestoneDefID)

我收到错误Join Expression Not Supported,然后它突出显示...

[@milestoneID] = tbl3.MilestoneDefID)

但是如你所见,在第一次加入...

INNER JOIN checklist_entries AS tbl2 ON tbl1.ProjectID = tbl2.ProjectID

我将其命名为 tbl2,然后使用 tbl2.ProjectID,表达式就可以正常工作。最终,无论我如何命名这些东西,我都需要让它发挥作用。

[@milestoneID] 是传递给查询的参数以匹配milestone_def.MilestoneDefID

【问题讨论】:

  • 问题标题“太大声”。
  • [@milestoneID] 是什么,它来自表吗?它来自什么表?尝试在该列之前放置正确的表别名,然后将tbl3.MilestoneDefID 与连接中的另一列一起使用。
  • 是传入查询的参数。
  • 几天前我在必须存储在第三个表中的 2 个表的简单总和中遇到了类似的错误。经过长时间的搜索,我了解到访问不支持动态子查询。我找到的唯一解决方案(我同意它不是最佳的,甚至不是有效的)是创建中间查询来执行我需要的操作并将结果存储在新表中。一旦我拥有了我需要的所有中间表,我就会在它们之间进行连接。为了使流程更高效,我创建了一个宏,它按顺序调用不同的查询,并调用一个查询来删除临时表中的数据
  • @user1066133 milestone_def 是否真的加入了查询中的任何其他表?

标签: sql ms-access


【解决方案1】:

[从 cmets 扩展。] 这只是一种预感,因为我无权访问 Access(哈哈),但您的查询当前指定了一个 INNER JOIN,它实际上并没有将表与其余部分相关联查询:

... 
INNER JOIN milestone_def AS tbl3
ON [@milestoneID] = milestone_def.MilestoneDefID
...

ON 子句仅引用一个外部变量,因此与 JOIN 操作无关,因此这实际上是一个带有单独 WHERE 条件的 CROSS JOIN

... 
CROSS JOIN milestone_def AS tbl3
...
WHERE [@milestoneID] = milestone_def.MilestoneDefID
...

查看查询的底部,您在WHERE 子句中有此表的实际连接条件;这些应该交换到ON 子句中,以便它实际上指定INNER JOIN 条件:

... 
INNER JOIN milestone_def AS tbl3
ON tbl1.ChecklistDay = tbl3.ChecklistDayMin
AND tbl2.ChecklistDay = tbl3.ChecklistDayMax
...
WHERE [@milestoneID] = milestone_def.MilestoneDefID
...

这样肯定更合乎逻辑,并且可能会解决 Access 的解析器理解您的查询的问题。

【讨论】:

  • 最后一条语句更清晰,对我有用。我唯一需要改变的是 WHERE [@milestoneID] = tbl3.MilestoneDefID。否则,查询要求提供两个参数,然后返回的记录多于应有的记录。谢谢。
【解决方案2】:

由于问题出在联接上,因此最好使用更简单的查询来调查问题。

SELECT *
FROM
    ((checklist_entries AS tbl1
    INNER JOIN checklist_entries AS tbl2
    ON tbl1.ProjectID = tbl2.ProjectID)
    INNER JOIN milestone_def AS tbl3
    ON [@milestoneID] = milestone_def.MilestoneDefID)
    INNER JOIN project_active_status AS tbl4
    ON tbl1.ProjectID = project_active_status.ProjectID

请注意,您已为表名起别名。因此,您必须使用这些别名而不是 ON 子句中的表名。

SELECT *
FROM
    ((checklist_entries AS tbl1
    INNER JOIN checklist_entries AS tbl2
    ON tbl1.ProjectID = tbl2.ProjectID)
    INNER JOIN milestone_def AS tbl3
    ON tbl1.[@milestoneID] = tbl3.MilestoneDefID)
    INNER JOIN project_active_status AS tbl4
    ON tbl1.ProjectID = tbl4.ProjectID

我不知道[@milestoneID] 是什么,也不知道它来自哪里。我最好的猜测是它是checklist_entries 中的一个字段,所以我用tbl1 别名对其进行了限定。

【讨论】:

    【解决方案3】:

    我认为 HansUp 的回答为您指明了正确的方向。我注意到的另一件事是,您有一系列三个嵌套的 IIF,最后一个只有一个测试和一个 true,但缺少 false 参数。我认为这三个都是强制性的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 2016-03-30
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多