简体   繁体   English

SQL嵌套内部联接

[英]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. 我想使用Project_ID的此查询返回查找那些项目的所有相关需求。

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. 因此,我想找到分配给特定用户的所有项目的需求,而不是找到项目“ 1”的需求。 Any help would be appreciated. 任何帮助,将不胜感激。

Cheers 干杯

If I understand correctly, you would just add another JOIN : 如果我理解正确,则只需添加另一个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列表中,以从需求中检索列的值。

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. 我们可能还想添加一个ORDER BY子句,以便按可预测的顺序返回行。

Note that if there are no matching rows in requirements for a given Project_ID , then that project will not be returned. 请注意,如果给定Project_ID requirements中没有匹配的行,则不会返回该项目。 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: 提议的查询与外部连接到requirements表:

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 . 等效地,我们可以在ORDER BY之前,将内部assigned_users.User_ID=4ON子句中的条件assigned_users.User_ID=4定位到WHERE子句。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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