【问题标题】:relating rows based on begin_date and end_date根据 begin_date 和 end_date 关联行
【发布时间】:2014-09-19 13:07:25
【问题描述】:

假设我们有一个设计不佳的数据库。

一个managers表和一个employees表,它们是不相关的。

只有一名经理受雇。每个都有一个开始日期和一个结束日期,所以

Emp_begin    Emp_end

Man_begin Man_end.

我如何编写一个查询来显示所有已聘用的员工 between '1930-01-01' AND '1960-01-01',以及他们聘用时的经理 (Emp_begin)

将不胜感激任何和所有的帮助

【问题讨论】:

  • 搜索 Between 子句 SQL 可能会有所帮助。这是一个您可以使用的持续 SO 问题:stackoverflow.com/questions/25912308/…
  • SELECT EmployeeName FROM employees E LEFT JOIN manager M ON E.ManegerId = M.ManagerId WHERE Emp_begin >= '1930-01-01' AND Emp_end = '1930-01-01' AND Man_end
  • 为什么这些不相关?
  • 如果没有经理雇用该员工的参考资料,您将无法做到这一点......您需要在员工表上提供 managerId !否则你不能得到真正的结果!
  • @SanRyu,不正确.. 你在这里有你需要的一切。

标签: mysql sql


【解决方案1】:
SELECT EmployeeName FROM employees E 
LEFT JOIN managers M ON E.ManegerId = M.ManagerId 
WHERE Emp_begin >= '1930-01-01' AND Emp_end <= '1960-01-01' AND 
      Man_begin >= '1930-01-01' AND Man_end <= '1960-01-01'

【讨论】:

    【解决方案2】:

    如果我理解正确,您尝试使用单个查询,我认为您可以将日期搜索合并到 WHERE 子句中

    SELECT EmployeeName FROM employees
    WHERE start BETWEEN '1930-01-01' AND '1960-01-01' 
    AND end BETWEEN '1930-01-01' AND '1960-01-01'
    

    DEMO here

    【讨论】:

      【解决方案3】:
         SELECT * 
           FROM employees e
      LEFT JOIN managers m
             ON m.man_begin <= e.emp_begin
            AND m.man_end >= e.emp_begin
          WHERE e.emp_begin BETWEEN '1930-01-01' AND '1960-01-01';
      

      虽然我绝对讨厌包含 BETWEEN 的日期范围.. 我希望你真的想要:

         SELECT * 
           FROM employees e
      LEFT JOIN managers m
             ON m.man_begin <= e.emp_begin
            AND m.man_end >= e.emp_begin
          WHERE e.emp_begin >= '1930-01-01' 
            AND e.emp_begin < '1960-01-01';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 2019-08-10
        • 2019-05-21
        相关资源
        最近更新 更多