我是(我的)SQL的新手,我需要知道如何构建特定查询(或者甚至是否可能)。
我有3个表格,简化如下:
Actions
-------
actionID | staffID | actionDetails | actionDate
Staff
-----
staffID | departmentID | userName | firstName | lastName
Departments
-----------
departmentID | departmentName
如您所见,departmentID是Staff表中的FK,staffID是Actions表中的FK。
我想根据departmentID提取以下字段:
这可以在带有连接的单个查询中完成,还是需要提取staffID然后迭代它们?
同样,我是新手,现在有点破坏了我的大脑。我不认为我这样做了!
答案 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类型
答案 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
来简化他们的陈述。这很常见,使事情更具可读性;我已将这些留在这里,以使连接语法更清晰。
我提供的示例使用了内部联接 - 它只返回可以在Staff
,Departments
和{{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;