3

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

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

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


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


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

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

我想根据部门ID 提取以下字段:

  • 用户名
  • 行动详情
  • 行动日期

这可以在带有连接的单个查询中完成,还是我需要提取人员 ID 然后遍历它们?

再说一次,我是新来的,这让我的大脑有些崩溃。我不认为我适合这个!

4

4 回答 4

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 类型 SQL中的连接类型

于 2013-04-30T12:33:02.787 回答
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记录Actions。如果要返回一个或多个表的所有行,并null在找不到匹配项时返回其他表,则可以使用外连接

于 2013-04-30T12:40:29.267 回答
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
于 2013-04-30T12:42:20.253 回答
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;
于 2013-04-30T12:32:42.840 回答