什么样的加入,如果有的话,适合这里?

时间:2013-04-30 12:27:21

标签: mysql sql

我是(我的)SQL的新手,我需要知道如何构建特定查询(或者甚至是否可能)。

我有3个表格,简化如下:

Actions
-------
actionID | staffID | actionDetails | actionDate


Staff
-----
staffID | departmentID | userName | firstName | lastName


Departments
-----------
departmentID | departmentName

如您所见,departmentID是Staff表中的FK,staffID是Actions表中的FK。

我想根据departmentID提取以下字段:

  • 的userName
  • 的firstName
  • lastName的
  • actionDetails
  • actionDate

这可以在带有连接的单个查询中完成,还是需要提取staffID然后迭代它们?

同样,我是新手,现在有点破坏了我的大脑。我不认为我这样做了!

4 个答案:

答案 0 :(得分:3)

尝试此查询。

select 
S.userName,
S.firstName,
S.lastName,
A.actionDetails,
A.actionDate
from Departments D 
join Staff S on d.departmentID=s.departmentID
join Actions A on s.staffID=A.staffID
WHERE D.departmentID = YourDeparmentID;

SQl中的JOIN类型 Types of Join in SQL

答案 1 :(得分:1)

当然,这可以通过连接来完成。事实上,这就是联接的目的。当你编写SQL时,你不想考虑迭代ID;相反,想想在“集合”中一次性获取数据。您可以使用外键来扩展这些集,实际上是创建一个包含多个表的大集。

SELECT Staff.userName, Staff.firstName, Staff.lastName, 
  Actions.actionDetails, Actions.actionDate
FROM Staff
INNER JOIN Departments ON Departments.DepartmentID = Staff.DepartmentID
INNER JOIN Actions ON Actions.StaffID = Staff.StaffID

你会注意到在其他答案中,人们使用别名,例如Staff as s来简化他们的陈述。这很常见,使事情更具可读性;我已将这些留在这里,以使连接语法更清晰。

我提供的示例使用了内部联接 - 它只返回可以在StaffDepartments和{{1}之间进行匹配的记录}。如果要返回一个或多个表的所有行,并在找不到匹配项时返回其他表的Actions,则可以使用外连接

答案 2 :(得分:1)

我毫不犹豫地给出一个简单的答案,因为这可能只是你将要遇到的许多类型问题的开始。所以我宁愿告诉你我是怎么想的,也许这会帮助你做其他事情。

正如上面的评论和其他答案所述,将这些视为集合。想想它们如何相互关联。然后考虑要返回的列,并考虑如何确定要查看的行。

因此,首先,我编写一个FROM子句来处理记录的来源(我给它们更短的名称或别名,以便更容易理解):

FROM Departments d
  INNER JOIN Staff s
  INNER JOIN Actions a

现在,它们有什么关系?在这种情况下,它们完全类似于PK - >你提到的FK关系。所以我将它添加到FROM子句:

FROM Departments d
  INNER JOIN Staff s 
    ON s.DepartmentId = d.DepartmentId
  INNER JOIN Actions a
    ON a.StaffId = s.StaffId

现在我使用SELECT子句确定要返回的列:

SELECT userName, firstName, lastName, actionDetails, actionDate

但是从哪个表中获取这些列?我将表别名添加到:

SELECT s.userName, s.firstName, s.lastName, a.actionDetails, a.actionDate

(请注意,在这种情况下,没有列出现在多个表中,因此别名不是绝对必要的,尽管它们是一种非常好的做法。)

最后,我添加了WHERE子句:

WHERE d.DepartmentId = 20

或您寻求的任何部门ID。

最后的答案是这样的:

SELECT s.userName, s.firstName, s.lastName, a.actionDetails, a.actionDate
FROM Departments d
  INNER JOIN Staff s 
    ON s.DepartmentId = d.DepartmentId
  INNER JOIN Actions a
    ON a.StaffId = s.StaffId
WHERE d.DepartmentId = 20

答案 3 :(得分:0)

对于部门ID 1

SELECT
    s.userName,
    s.firstName,
    s.lastName,
    a.actionDetails,
    a.actionDate
FROM Staff AS s
LEFT JOIN Departments AS d ON d.departmentID = s.departmentID
LEFT JOIN Actions AS a ON a.staffID = s.staffID
WHERE d.departmentID = 1;