2013-07-02 133 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,最後一個只有一個測試和一個真正的但缺少假參數。我認爲所有三個都是強制性的。