2013-07-02 5 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) 

Я получаю ошибку Присоединяйтесь Expression не поддерживается, а затем она выдвигает на первый план ...

[@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

[Добавлено из комментариев.] Это только догадка, так как у меня нет доступа к Access (ха-ха), но в вашем запросе в настоящее время указывается 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, а у последней есть только тест и истина, но отсутствует ложный параметр.Я думал, что все трое были обязательными.

Смежные вопросы