2014-12-11 3 views
-1

Я использую MS Access и имею проблемы с написанием запросов, чтобы получить конечный результат. Может быть, кто-то может протянуть руку.Вложенные SQL-запросы 3 уровня

У меня есть таблицы проектов, задач и подзадач. Каждая таблица имеет связанную таблицу для «Назначение». что проект может быть назначен сотруднику, но дочерние задачи могут быть назначены другому сотруднику, и, кроме того, подзадачи могут быть назначены другим сотрудникам.

Теперь, когда вы показываете это на экране, я запрашиваю сотрудника, который был назначен для любого проекта/задачи/подзадачи. Мне нужны эти данные для отображения, но не для других данных. Так, например, если сотрудник, которого я запрашиваю только, был назначен для задачи, тогда этот проект и задача должны отображаться, но никаких дополнительных проектов/задач/и никаких подзадач. Аналогично, если я запрошу сотрудника, который был назначен только подзадаче, тогда я хочу видеть только соответствующий проект и задачу. Я думаю, что могу закончить это с помощью ряда запросов ... я думаю ... но есть ли пятновый метод, который я могу использовать для создания этих данных.

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

Спасибо за любую помощь!

Обновлено с дополнительной информацией:

структуры таблицы:

CREATE TABLE [dbo].[Projects](
[ProjectID] [int] IDENTITY(1,1) NOT NULL, 
[ProjectName] [varchar](100) NULL, 
[ClientID] [int] NULL, 

CREATE TABLE [dbo].[PM_ProjectAssignee](
[AssigneeID] [int] IDENTITY(1,1) NOT NULL, 
[ProjectID] [int] NULL, 
[EmployeeID] [int] NULL, 

CREATE TABLE [dbo].[PM_ProjectTasks](
[ProjectTaskID] [int] IDENTITY(1,1) NOT NULL, 
[ProjectID] [int] NULL, 
[TaskID] [smallint] NULL, 

CREATE TABLE [dbo].[PM_TaskAssignee](
[AssigneeID] [int] IDENTITY(1,1) NOT NULL, 
[ProjectTaskID] [int] NULL, 
[EmployeeID] [int] NULL, 

CREATE TABLE [dbo].[PM_ProjectSubTasks](
[ProjectSubTaskID] [int] IDENTITY(1,1) NOT NULL, 
[ProjectTaskID] [int] NULL, 
[SubTaskDesc] [varchar](255) NULL, 

CREATE TABLE [dbo].[PM_SubTaskAssignee](
[AssigneeID] [int] IDENTITY(1,1) NOT NULL, 
[ProjectSubTaskID] [int] NULL, 
[EmployeeID] [int] NULL, 

Что касается запросов, которые я попробовал ... много. Я реализует сценарий, когда я закончил с около полутора десятков различных запросов всех завершившихся в один (некоторые из запросов, где построен с кодом, чтобы фильтровать) Однако последний попытался было:

SELECT ProjectID, ProjectName, EmployeeID, ProjectTaskID, EmployeeID, Association, ProjectSubTaskID, EmployeeID 
FROM (qrTest3_Project LEFT JOIN qrTest2_Task ON qrTest3_Project.ProjectID = qrTest2_Task.ProjectID) LEFT JOIN qrtest1_SubTask ON qrTest2_Task.ProjectTaskID = qrtest1_SubTask.Association 
WHERE (((qrTest3_Project.EmployeeID)=8)) OR (((qrTest2_Task.EmployeeID)=8)) OR (((qrtest1_SubTask.EmployeeID)=8)); 

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

Надеюсь, что предоставит вам дополнительную информацию? Если нет, будем рады предоставить больше. Спасибо!

+2

Добро пожаловать в StackOverflow (SO)! Когда вы задаете вопрос о том, как это помогает, необходимо предоставить структуру таблицы, столбцы, ожидаемые повторные значения и отношение таблиц. Кроме того, предоставьте то, что вы пробовали. Мы стараемся избегать написания кода для вас, но все рады помочь, когда вы застрянете. Поэтому, если вы можете обновить свой вопрос с помощью структуры таблицы, как соотносятся, желаемые результаты и примеры данных, а также то, что вы пробовали, мы сделаем все возможное, чтобы помочь. Как бы там ни было, нам сложно помочь, так как мы не знаем столбцы, ожидаемые результаты и образцы данных! – xQbert

+0

Любые идеи кто-нибудь? – Voyagr12

+0

MS Access не имеет схем ('dbo'),' IDENTITY', 'INT' или 'VARCHAR'. Это синтаксис SQL Server. –

ответ

1

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

SELECT PM_ProjectAssignee.ProjectID, PM_ProjectTasks.ProjectTaskID, PM_ProjectSubTasks.ProjectSubTaskID 
FROM (((PM_ProjectAssignee 
LEFT JOIN PM_ProjectTasks 
ON PM_ProjectAssignee.ProjectID = PM_ProjectTasks.ProjectID) 
LEFT JOIN PM_ProjectSubTasks 
ON PM_ProjectTasks.ProjectTaskID = PM_ProjectSubTasks.ProjectTaskID) 
LEFT JOIN PM_TaskAssignee 
ON PM_ProjectTasks.ProjectTaskID = PM_TaskAssignee.ProjectTaskID) 
LEFT JOIN PM_SubTaskAssignee 
ON PM_ProjectSubTasks.ProjectSubTaskID = PM_SubTaskAssignee.ProjectSubTaskID 
WHERE (((PM_ProjectAssignee.EmployeeID)=14)) 
OR (((PM_TaskAssignee.EmployeeID)=14)) 
OR (((PM_SubTaskAssignee.EmployeeID)=14)) 
GROUP BY PM_ProjectAssignee.ProjectID, PM_ProjectTasks.ProjectTaskID, PM_ProjectSubTasks.ProjectSubTaskID; 
+0

Это было бы гораздо более читаемым с помощью псевдонимов таблицы (pa, pt, pst, ta, sta) и без круглых скобок. – philipxy

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