2014-08-29 63 views
-1

'我有一个数据库,员工被分配到不同的项目。有些项目分为不同的任务。以下数据库结构已创建。'加入具有相同外键的多个表

USER: 
+------------+-------------+ 
| Person ID | Name  | 
+------------+-------------+ 
| 1   | A   | 
| 2   | B   | 
| 3   | C   | 
+------------+-------------+ 
PROJECT_ASSIGNMENT: 
+-----------------+-------------+-----------+ 
| P_Assign key | Project Key | Person ID | 
+-----------------+-------------+-----------+ 
| 1    | 1   | 1   | 
| 2    | 1   | 2   |  
| 3    | 1   | 3   |  
+------------+-------------+------+-----+---- 
TASK ASSIGNMENT: 
+-----------------+-------------+-----------+--------+ 
| T_Assign key | Project Key | Person ID |task key| 
+-----------------+-------------+-----------+--------+ 
| 1    | 2   | 1   | 1  | 
| 2    | 2   | 2   | 1  | 
| 3    | 2   | 3   | 1  | 
| 4    | 2   | 1   | 2  | 
| 5    | 2   | 2   | 2  | 
| 6    | 2   | 3   | 2  | 
+------------+-------------+------+-----+------------+; 

'What type of query would be required to get results like this?' 

+-----------------+-------------+-----------+ 
| Person ID  | Project Key | Task Key | 
+-----------------+-------------+-----------+ 
| 1    | 1   | NULL  | 
| 1    | 2   | 1   | 
| 1    | 2   | 2   | 
| 2    | 1   | NULL  | 
| 2    | 2   | 1   | 
| 2    | 2   | 2   | 
| 3    | 1   | NULL  | 
| 3    | 2   | 1   | 
| 3    | 2   | 2   | 
+------------+-------------+------+-----+---+ 

我已经尝试了一些查询,但我认为有相同的外键防止我得到我需要的结果。

SELECT 
user.person_ID, 
task_assignment.Project Key, 
project_assignment.Project Key 
FROM user 
JOIN dbo.project_assignment 
    ON project_assignment.person_key=user.person_key 
LEFT JOIN dbo.task_assignment 
    ON dbo.project_assignment.person_key=dbo.task_assignment.person_key 

如果一个项目被分成任务,该人被分配到该任务。 如果某个项目未分解成任务,则该人被分配到该项目。

+2

你尝试过什么?请包括示例代码来证明您已经付出了一些努力来解决此问题。 – nrussell 2014-08-29 18:26:45

回答

0

给出样本数据,为了获得相同的确切结果,我们需要结合两个查询。

第一个查询:

SELECT u.person_id 
    , p.project_key 
    , t.task_key 
    FROM user u 
    JOIN project_assignment p 
    ON p.person_id = u.person_id 
    LEFT 
    JOIN task_assignment t 
    ON t.person_id = p.person_id 
    AND t.project_key = p.project_key 
ORDER 
    BY u.person_id 
    , p.project_key 

将返回:

person_id project_key task_key 
--------- ----------- -------- 
1   1   NULL 
2   1   NULL 
3   1   NULL 

而第二个查询:

SELECT u.person_id 
    , t.project_key 
    , t.task_key 
    FROM user u 
    JOIN task_assignment t 
    ON t.person_id = u.person_id 
ORDER 
    BY u.person_id  
    , t.project_key 
    , t.task_key 

返回结果:

person_id project_key task_key 
--------- ----------- -------- 
1   2   1 
1   2   2 
2   2   1 
2   2   2 
3   2   1 
3   2   2 

这两个查询的结果可以用UNION ALL集合运算符进行组合,然后加上一个ORDER BY子句,例如:

SELECT u.person_id 
    , p.project_key 
    , t.task_key 
    FROM user u 
    JOIN project_assignment p 
    ON p.person_id = u.person_id 
    LEFT 
    JOIN task_assignment t 
    ON t.person_id = p.person_id 
    AND t.project_key = p.project_key 
UNION ALL 
SELECT u.person_id 
    , t.project_key 
    , t.task_key 
    FROM user u 
    JOIN task_assignment t 
    ON t.person_id = u.person_id 
ORDER 
    BY person_id 
    , project_key 
    , task_key IS NOT NULL 
    , task_key 

有一些案件中没有涉及的示例数据.. 。如果对于给定的用户,在project_assignment表和task_assignment表中都出现相同的项目键。输出应该是什么样子? (有可能是查询中做了一些调整。)

0

即使你没有真正展示你所做的。对于这种情况的一个例子查询:

SELECT p.P_Assign key, p.Project Key, p.Person I FROM PROJECT_ASSIGNMENT p 
INNER JOIN TASK ASSIGNMENT t 
ON p.Person_ID=t.Person_ID 

假设person_id是project_assignment和任务分配的外键的主键。

这将加入前两个。在你的select语句中指定你想要在结果中显示的列。

0

我没有实际的想法,你想要的这里,但我想可能是你正在寻找此查询:

SELECT PersonId, ProjectKey, TaskKey 
FROM TASK_ASSIGNMENT 
GROUP BY PersonId, ProjectKey, TaskKey; 

希望这有助于。

0

尝试如下....

Select 
User.Person_ID, 
all_tasks.Project_key, 
all_tasks.Task_Key 
From User 
Left Join 
(
Select Person_ID, Project_Key, Null as Task_Key From Project_Assignment 
Union All 
Select Person_ID, Project_key, Task_Key From Task_Assignment 
) all_tasks On all_tasks.person_ID = User.Person_ID 
相关问题