【问题标题】:Update table data, fetched from another table更新表数据,从另一个表中获取
【发布时间】:2019-10-07 05:23:47
【问题描述】:

我有一个存储员工出勤信息的表和另一个存储员工轮班信息的表,这基本上是一个值班表。

这是出勤表的结构

CREATE TABLE Attendance
(
ID INT,
EmpCode INT,
ShiftCode INT, 
CheckIn DATETIME,
CheckOut DATETIME
)



INSERT INTO Attendance VALUES (1, 1, 1, '2019-09-01 09:16:23', NULL)
INSERT INTO Attendance VALUES (2, 1, 1, NULL, '2019-09-01 18:01:56')
INSERT INTO Attendance VALUES (3, 1, 2, '2019-09-02 09:00:00', NULL)
INSERT INTO Attendance VALUES (4, 1, 2, NULL, '2019-09-02 18:48:21')
INSERT INTO Attendance VALUES (5, 1, 1, '2019-09-13 09:27:00', NULL)
INSERT INTO Attendance VALUES (6, 1, 1, NULL, '2019-09-13 18:45:00')
INSERT INTO Attendance VALUES (7, 2, 2, '2019-09-01 21:19:17', NULL)
INSERT INTO Attendance VALUES (8, 2, 2, NULL, '2019-09-01 23:30:56')
INSERT INTO Attendance VALUES (9, 2, 2, '2019-09-05 09:23:00', NULL)
INSERT INTO Attendance VALUES (10, 2, 2, NULL, '2019-09-05 17:19:00')

这是职责名册的结构和示例数据。

CREATE TABLE Shifts
(
ID INT PRIMARY KEY,
EmpCode INT,
ShiftCode INT,
StartDate DATETIME,
EndDate DATETIME
)

INSERT INTO Shifts VALUES (1, 1, 24, '2019-09-01 00:00:00', '2019-09-05 00:00:00');
INSERT INTO Shifts VALUES (2, 2, 25, '2019-09-01 00:00:00', '2019-09-05 00:00:00');

这个想法是将出勤表中的 ShiftCode 更新为存储在值班表中的班次。因此,如果员工1 的出勤率介于'2019-09-01''2019-09-05' 之间,则该员工的班次代码应更新为24,其他员工也应如此。如果出勤表中的日期不存在值班名册,则不应对其进行更新并保持原样。 我需要更新查询。

【问题讨论】:

    标签: sql sql-server tsql sql-update


    【解决方案1】:

    类似这样的:

    SELECT *
    FROM Attendance A
    INNER JOIN Shifts S
        ON A.EmpCode = S.[EmpCode]
        AND 
        (
            A.CheckIn BETWEEN S.[StartDate] AND S.[EndDate]
            OR
            A.CheckOut BETWEEN S.[StartDate] AND S.[EndDate]
        )
    

    还有更新:

    UPDATE Attendance
    SET ShiftCode = S.[ShiftCode]
    FROM Attendance A
    INNER JOIN Shifts S
        ON A.EmpCode = S.[EmpCode]
        AND 
        (
            A.CheckIn BETWEEN S.[StartDate] AND S.[EndDate]
            OR
            A.CheckOut BETWEEN S.[StartDate] AND S.[EndDate]
        );
    

    【讨论】:

      【解决方案2】:

      我试过这个,它也有效:

      UPDATE Attendance
      SET ShiftCode = ISNULL((SELECT ShiftCode FROM Shifts Roster
      WHERE CAST(COALESCE(CheckIn, CheckOut) AS DATE) BETWEEN StartDate AND EndDate AND EmpCode = Attendance.EmpCode),
      (SELECT ShiftCode FROM EmployeeInfo WHERE EmployeeInfo.ID = Attendance.EmpCode))
      

      【讨论】:

        【解决方案3】:

        试试这个。会有帮助的

        UPDATE Attendance SET ShiftCode=c.ShiftsShiftCode
        FROM Attendance a
        JOIN
        (
            SELECT a.EmpCode, a.ShiftCode, CheckIn, CheckOut, b.ShiftCode AS ShiftsShiftCode FROM Attendance a
            JOIN Shifts b ON a.EmpCode=b.EmpCode
            AND (a.CheckIn BETWEEN StartDate AND EndDate OR a.CheckOut BETWEEN StartDate AND EndDate)
        )c
        ON a.EmpCode = c.EmpCode
        AND (a.checkin=c.checkin OR a.CheckOut=c.CheckOut)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-22
          • 2017-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 2019-05-02
          相关资源
          最近更新 更多