2013-07-02 179 views
0

我在这个特定的语句上不断收到语法错误。访问内部连接的问题

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; 

错误说语法错误在加入操作,然后milestone_def凸显了第二INNER JOIN之后。有趣的是,如果我转这条线......

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

这条线......

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

我得到的错误加入不支持表达,然后它突出...

[@milestoneID] = tbl3.MilestoneDefID) 

但你可以看到,在第一个加入...

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

我把它命名为tbl2,然后使用tbl2.ProjectID,表达式工作得很好。最终,我需要得到这个工作,不管我如何命名这些东西。

[@milestoneID]是传递到查询匹配milestone_def.MilestoneDefID

+1

问题标题“太大声”。 – Lion

+1

什么是'[@milestoneID]'它是从一个表中取出来的?它是从哪里来的?尝试在该列之前放置正确的表别名,然后对连接中的另一列使用'tbl3.MilestoneDefID'。 – Taryn

+0

这是一个传递给查询的参数。 –

回答

1

[只看该作者]这只是一个预感,因为我没有访问权限(哈哈),但是你的查询当前指定了一个INNER JOIN,它实际上并没有将表格与其余的查询:

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

ON该子句的引用仅外部变量,因此是不相关的操作JOIN,使得这有效地一个CROSS JOIN与单独WHERE条件:

... 
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 
... 

这当然是更合乎逻辑的这种方式,它很可能会解决这个问题访问的解析器是有理解您的查询。

+0

最后一个陈述更加清晰,并为我工作。只有我必须改变的是WHERE [@milestoneID] = tbl3.MilestoneDefID。否则,查询会询问两个参数,并返回更多的记录。谢谢。 –

1

一个参数,因为这个问题是与连接,你将是明智具有更简单的查询,以调查该问题。

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别名对其进行了限定。

-1

我认为HansUp的回答是指引你朝着正确的方向发展。我注意到的另一件事是,你有一系列三个嵌套的IIF,最后一个只有一个测试和一个真正的但缺少假参数。我认为所有三个都是强制性的。