简体   繁体   中英

SQL Nested Inner Joins

Im trying to use the results of an inner join in another query and having trouble getting my head around how.

This is the first query i am running:

SELECT projects.Project_ID, projects.Name
FROM projects
INNER JOIN assigned_users
ON assigned_users.Project_ID=projects.Project_ID AND assigned_users.User_ID=4;

This is getting all of the assigned projects for a particular user. The Project_ID's this query returns i want to use to find all the related requirements for those projects.

SELECT *
FROM requirements
WHERE requirements.Project_ID=1;

So instead of finding the requirements for project '1' i want to get the requirements for all projects assigned to a particular user. Any help would be appreciated.

Cheers

If I understand correctly, you would just add another JOIN :

SELECT . . .
FROM assigned_users au JOIN
     projects p
     ON au.Project_ID = p.Project_ID JOIN
     requirements r
     ON r.Project_ID = p.Project_ID
WHERE au.User_ID = 4;

You can use either:

SELECT *
FROM requirements req
INNER JOIN projects pro 
    ON req.Project_ID = pro.Project_ID
INNER JOIN assigned_users u
    ON u.Project_ID=pro.Project_ID
WHERE u.User_ID=4;

or

SELECT *
FROM requirements
WHERE requirements.Project_ID=(
    SELECT Project_ID
    FROM projects
    INNER JOIN assigned_users
    ON assigned_users.Project_ID=projects.Project_ID AND assigned_users.User_ID=4;
);

To the existing query, we can just add:

  JOIN requirements
    ON requirements.Project_ID = projects.Project_ID

We add expressions to the SELECT list to retrieve values of columns from requirements.

SELECT projects.Project_ID, projects.Name
     , requirements.some_column
     , requirements.some_other_column

It's likely that we also want to add an ORDER BY clause so that the rows are returned in a predictable sequence.

Note that if there are no matching rows in requirements for a given Project_ID , then that project will not be returned. To return those rows, we can specify an outer join.

Current query:

SELECT projects.Project_ID
     , projects.Name
  FROM projects
  JOIN assigned_users
    ON assigned_users.Project_ID=projects.Project_ID
   AND assigned_users.User_ID=4

Proposed query with outer join to requirements table:

SELECT projects.Project_ID
     , projects.Name
     , requirements.Requirement_ID
     , requirements.Requirement_Name 
  FROM projects
  JOIN assigned_users
    ON assigned_users.Project_ID=projects.Project_ID
   AND assigned_users.User_ID=4
  LEFT
  JOIN requirements 
    ON requirements.Project_ID = projects.Project_ID
 ORDER
    BY projects.Project_ID
     , requirements.Requirement_ID

Equivalently, we could relocate the condition assigned_users.User_ID=4 from the ON clause of the inner join to a WHERE clause, before the ORDER BY .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM