【问题标题】:search pk have a AND b搜索 pk 有一个 AND b
【发布时间】:2016-06-27 13:59:42
【问题描述】:
我怎样才能实现以下目标:
"任何具有现在和迟到状态的员工"
我的桌子是这样的
employee
+--------+---------+
| emp_id | name |
+--------+---------+
| a001 | michael |
+--------+---------+
| a002 | john |
+--------+---------+
status
+--------+---------+
| emp_id | status |
+--------+---------+
| a001 | Present |
+--------+---------+
| a001 | Latein |
+--------+---------+
| a002 | Absence |
+--------+---------+
【问题讨论】:
标签:
sql
sql-server
relational-database
relationship
【解决方案1】:
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
【解决方案2】:
一种方法是在从状态派生的表上使用内连接:
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
派生表将仅包括那些同时具有Present 和Latein 记录的员工。
【解决方案3】:
对status 表使用条件聚合来确定哪些员工拥有'Present' 和'Latein'。然后将此结果连接到employee 表以获取匹配的名称。
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
【解决方案4】:
我认为您正在寻找 Latein 员工。如果他们迟到了,他们必须在场,否则他们没有来并且缺席。
所以对你来说最好使用
SELECT emp_id FROM status WHERE status='Latein'