【问题标题】: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  
    

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

    【讨论】:

      【解决方案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'

        【讨论】:

          猜你喜欢
          • 2021-11-28
          • 1970-01-01
          • 2012-03-23
          • 2020-07-20
          • 1970-01-01
          • 1970-01-01
          • 2012-04-10
          • 1970-01-01
          • 2016-02-14
          相关资源
          最近更新 更多