将两个 SQL 查询连接在一起,但使用第一个查询中的变量来执行第二个

问题描述 投票:0回答:2

我正在尝试在 MySQL 中执行 SQL 查询,然后“右”连接第二个查询的列。

但是,为了执行第二个查询,我需要第一个查询结果中的变量(员工编号)。

此示例显示特定团队中的员工,同时还广告一列,显示该行中的员工未能上班的次数。

员工日志表仅保存员工 ID 号以及他们是否到岗。

SELECT employee.id_number, employee.name, employee.surname 
FROM employee 
WHERE employee.team_name = "alpha";

Select count(employee_log.attendance_type) 
FROM employee_log 
WHERE employee_log.attendance_type = "No-Show"; AND (match with the returned employee.id_number from the 1st query....then join this column onto the right of the query above....right inner join I suppose?)

我不确定发布此内容时我在寻找什么,我假设可能是内部联接操作或子查询?这是我必须尝试和开发的第一个复杂查询。

如果有人可以帮助我,我将非常感激。

谢谢

sql join subquery union
2个回答
0
投票

如果我正确的话,下面的查询应该会有所帮助。

Select count(employee_log.attendance_type) 
FROM employee_log log
JOIN (
    SELECT employee.id_number, employee.name, employee.surname 
    FROM employee 
    WHERE employee.team_name = "alpha";
) emp ON emp.id_number = log.id_number
WHERE employee_log.attendance_type = "No-Show"

0
投票

您所追求的是加入。有多种连接类型:

  • INNER JOIN(两个表都必须有数据)
  • LEFT JOIN(左表中的所有记录以及右表中匹配的记录)
  • RIGHT JOIN(右表中的所有记录以及左表中匹配的记录)
  • 完整外部(两个表中的所有记录在匹配位置对齐)
  • CROSS JOIN(两个表中的所有记录相互关联(1 个表中 5 条记录,另一个表 10 条记录产生 (5*10) 50 条记录)
  • OUTER APPLY(一个表值函数,它将返回外部每条记录的子查询结果。例如,也许我想要每个员工的前 10 个最新日志条目,我们可以选择前 10 个并关联员工 ID;但是你在这里不需要这个)
  • UNION、MINUS、EXCEPT、UNION ALL、INTERSECT...都是 SET 运算符,而不是技术上的联接。他们根据其他数据集评估整个数据集。 UNION 组合两个集合并消除重复项,EXCEPT/MINUS 删除第二个集合中找到的第一个集合中的数据,而 intersect 显示它们在两个集合中存在的位置。 UNION ALL 结合两者并保留重复项。集合运算符似乎与您的问题没有密切关系。

假设

  • employee_log 有一个名为 id_number 的字段,它是employee.id_number 的外键
  • 我们使用合并以防 alpha 中的任何员工在日志表中没有条目。在这种情况下,我们希望显示 0 而不是 NULL

备注:

  • 别名表可提高员工日志的可读性 (E) (EL)

  • 使用了LEFT连接(包括员工表中的所有记录,并且仅包含员工日志中匹配的记录。

  • 在加入本身的 attend_type 上应用了过滤器。如果我们将其放在 where 子句中,它将否定左连接,使其表现得像内连接。

  • 左连接,右连接它是关于表的顺序。因此,我们想要显示所有 alpha 团队员工以及他们未出现的次数。

流程:

  • 系统检索“alpha”团队的所有员工
  • 系统获取与 alpha 员工关联的所有“缺勤”日志文件
  • 系统按 ID、名字、姓氏来统计未出现分组的条目
  • 系统渲染输出

查询:

SELECT E.id_number, E.name, E.surname, coalesce(count(EL.attendance_type),0) as NoShows
FROM employee E
LEFT JOIN employee_log EL
  on E.id_number = EL.id_number
 AND EL.attendance_type = 'No-Show'
WHERE E.team_name = 'alpha'
GROUP BY E.id_number, E.name, E.surname
© www.soinside.com 2019 - 2024. All rights reserved.