簡體   English   中英

使用案例表達式從另一個表更新表

[英]Update table from another table with Case Expression

當“statustype”=out 時,我想從“dateattend”列中的“dailydata”表更新“dailydatawh”表中的“statusout”列

UPDATE DAILYDATAWH 
SET STATUSOUT=
(SELECT 
 (case when STATUSTYPE='OUT' then DATEATTEND end)as STATUSOUT
FROM DAILYDATA
GROUP By NIP,NAME,DEPARTMENT,DATEATTEND,STATUSTYPE)
WHERE STATUSOUT = NULL

表每日數據

表每日數據WH

——

在我嘗試以下答案后

UPDATE DDW
SET    STATUSOUT = DD.DATEATTEND 
FROM   DAILYDATAWH DDW
       INNER JOIN DAILYDATA DD ON DDW.NIP = DD.NIP
                              AND DDW.NAME = DD.NAME
                              AND DDW.DEPARTMENT = DD.DEPARTMENT
WHERE  DD.STATUSTYPE = 'OUT'

這個查詢是有效的,但是當我在表 DAILYDATA 中輸入新數據(NIP、NAME、DEPARTMENT、DATEATTEND、STATUSTYPE)時,'STATUSOUT'(表 DAILYDATAWH)中的新值仍然出現上一個日期

表每日數據 表每日數據WH

這是查詢的當前輸出:

UPDATE DDW
SET    STATUSOUT = DD.DATEATTEND 
FROM   dailydatawh DDW
       INNER JOIN 
       (
           SELECT NIP, NAME, DEPARTMENT, DATEATTEND = MAX(DATEATTEND)
           FROM   dailydata 
           WHERE  STATUSTYPE = 'OUT'
           GROUP BY NIP, NAME, DEPARTMENT
       ) DD                    ON DDW.NIP = DD.NIP
                              AND DDW.NAME = DD.NAME
                              AND DDW.DEPARTMENT = DD.DEPARTMENT

電流輸出

這是樣本輸入

示例輸入表

這是示例輸出

示例輸出表

您內部加入表格(這里我假設它基於列NIP因為未提供實際信息)

UPDATE DDW
SET    STATUSOUT = DD.DATEATTEND 
FROM   dailydatawh DDW
       INNER JOIN dailydata DD ON DDW.NIP = DD.NIP
                              AND DDW.NAME = DD.NAME
                              AND DDW.DEPARTMENT = DD.DEPARTMENT
WHERE  DD.STATUSTYPE = 'OUT'

更新的查詢。

UPDATE DDW
SET    STATUSOUT = DD.DATEATTEND 
FROM   dailydatawh DDW
       INNER JOIN 
       (
           SELECT NIP, NAME, DEPARTMENT, DATEATTEND = MAX(DATEATTEND)
           FROM   dailydata 
           WHERE  STATUSTYPE = 'OUT'
           GROUP BY NIP, NAME, DEPARTMENT
       ) DD                    ON DDW.NIP = DD.NIP
                              AND DDW.NAME = DD.NAME
                              AND DDW.DEPARTMENT = DD.DEPARTMENT
WHERE DDW.STATUSOUT IS NULL

更新的查詢 #2。

UPDATE DDW
SET    STATUSOUT = DD.DATEATTEND 
FROM   dailydatawh DDW
       CROSS APPLY
       (
           SELECT TOP 1 d.DATEATTEND
           FROM   dailydata d
           WHERE  d.STATUSTYPE = 'OUT'
           AND    d.NIP =  DDW.NIP
           AND    d.NAME = DDW.NAME
           AND    d.DEPARTMENT = DDW.DEPARTMENT
           ORDER BY d.ID DESC
       ) DD
WHERE  DDW.STATUSOUT IS NULL

這是將您的插入和更新合並為一個查詢的查詢

; WITH CTE AS
(
    SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY NIP, NAME, DEPARTMENT 
                                          ORDER BY DATEATTEND)
    FROM   DAILYDATA
)
INSERT INTO DAILYDATAWH (NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
SELECT  NIP, NAME, DEPARTMENT, STATUSIN = MIN(DATEATTEND), STATUSOUT = MAX(DATEATTEND)
FROM    CTE
GROUP BY NIP, NAME, DEPARTMENT, (RN - 1) / 2

數據庫<>小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM