代码之家  ›  专栏  ›  技术社区  ›  Mohideen bin Mohammed

mysql join-表A所有行都应该与表B的每一行连接

  •  0
  • Mohideen bin Mohammed  · 技术社区  · 5 年前

    我希望A表的所有行都应与B表联接。

    表A-日历

    id date
    1  2019-08-01
    2  2019-08-02
    3  2019-08-03
    4  2019-08-04
    5  2019-08-05
    

    表B-员工出勤率

    emp_id  attended_date  ispresented
    EMP001  2019-08-01     1
    EMP001  2019-08-02     1
    EMP001  2019-08-03     1
    EMP001  2019-08-04     1
    EMP002  2019-08-02     1
    EMP002  2019-08-03     1
    EMP002  2019-08-04     1
    EMP002  2019-08-05     1
    EMP003  2019-08-01     1
    EMP003  2019-08-02     1
    EMP003  2019-08-03     1
    EMP004  2019-08-03     1
    EMP004  2019-08-04     1
    EMP004  2019-08-05     1
    EMP005  2019-08-01     1
    EMP005  2019-08-05     1
    

    这是样品台。 在表1中,我已经生成了日期范围

    在表2中-如果有员工参加,员工将有出勤记录。

    所以,我想约会,即使员工没有被打开。

    我试过离开,加入和所有人。

    join happens based on date if exists on both end.
    

    我想添加不存在的日期,默认情况下,保留字段将为空。

    预期行应为:

    EMPID   DATE          ispresented
    EMP001  2019-08-01     1
    EMP001  2019-08-02     1
    EMP001  2019-08-03     1
    EMP001  2019-08-04     1
    EMP001  2019-08-05     0
    EMP002  2019-08-01     0
    EMP002  2019-08-02     1
    EMP002  2019-08-03     1
    EMP002  2019-08-04     1
    EMP002  2019-08-05     1
    

    等...

    1 回复  |  直到 5 年前
        1
  •  1
  •   Nick SamSmith1986    5 年前

    因为您希望获得每个日期的每个员工的状态,所以需要执行 CROSS JOIN 在员工列表之间(从 Attendance )以及日期列表(从 Calendar )然后 LEFT JOIN 出勤 得到 ispresented 对于每个组合:

    SELECT E.emp_id,
           C.date,
           COALESCE(A.ispresented, 0) AS ispresented
    FROM (SELECT DISTINCT emp_id
          FROM Attendance) E
    CROSS JOIN Calendar C
    LEFT JOIN Attendance A ON A.emp_id = E.emp_id AND A.attended_date = C.date
    ORDER BY emp_id, date
    

    输出:

    emp_id  date        ispresented
    EMP001  2019-08-01  1
    EMP001  2019-08-02  1
    EMP001  2019-08-03  1
    EMP001  2019-08-04  1
    EMP001  2019-08-05  0
    EMP002  2019-08-01  0
    EMP002  2019-08-02  1
    EMP002  2019-08-03  1
    EMP002  2019-08-04  1
    EMP002  2019-08-05  1
    EMP003  2019-08-01  1
    EMP003  2019-08-02  1
    EMP003  2019-08-03  1
    EMP003  2019-08-04  0
    EMP003  2019-08-05  0
    EMP004  2019-08-01  0
    EMP004  2019-08-02  0
    EMP004  2019-08-03  1
    EMP004  2019-08-04  1
    EMP004  2019-08-05  1
    EMP005  2019-08-01  1
    EMP005  2019-08-02  0
    EMP005  2019-08-03  0
    EMP005  2019-08-04  0
    EMP005  2019-08-05  1
    

    Demo on dbfiddle