搜索 pk 有 a AND b

search pk have a AND b

我怎样才能实现这样的目标: "Any employee with Present AND Latein status"

我的桌子是这样的

employee
+--------+---------+
| emp_id | name    |
+--------+---------+
| a001   | michael |
+--------+---------+
| a002   | john    |
+--------+---------+

status
+--------+---------+
| emp_id | status  |
+--------+---------+
| a001   | Present |
+--------+---------+
| a001   | Latein  |
+--------+---------+
| a002   | Absence |
+--------+---------+

我认为您正在寻找 Latein 员工。如果他们迟到,他们必须在场,否则他们没有来并且缺席。 所以对你来说最好使用

SELECT emp_id FROM status WHERE status='Latein'

select e.name
from employee e
join status s on s.emp_id = e.emp_id
where s.status in ('Present', 'Latein')
group by e.emp_id, e.name
having count(*) = 2

一种方法是对来自状态的派生 table 使用内部联接:

SELECT name
FROM employee E
INNER JOIN
(
    SELECT emp_Id
    FROM status 
    WHERE status IN('Present', 'Latein')
    GROUP BY emp_Id
    HAVING COUNT(*) = 2
) D 
ON E.emp_Id = D.emp_Id  

派生的 table 将仅包括那些同时具有 PresentLatein 记录的员工。

status table 使用条件聚合来确定哪些员工有 'Present''Latein'。然后将此结果加入 employee table 以获得匹配的名称。

SELECT t1.emp_id, t1.name
FROM employee t1
INNER JOIN
(
    SELECT emp_id,
        SUM(CASE WHEN status = 'Present' OR status = 'Latein'
                 THEN 1 ELSE 0 END) AS statusSum
    FROM status
    GROUP BY emp_id
    HAVING statusSum = 2
) t2
    ON t1.emp_id = t2.emp_id