使用案例表达式从另一个表更新表

Posted

技术标签:

【中文标题】使用案例表达式从另一个表更新表【英文标题】:Update table from another table with Case Expression 【发布时间】:2020-02-11 02:46:28 【问题描述】:

当“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

--

在我尝试以下答案后

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 表)中的新值仍然出现在以前的日期

这是带有查询的当前输出:

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

这是示例输入

这是示例输出

【问题讨论】:

你的问题是什么? 抱歉,我的问题是当 statustype = out 时,如何从该表中更新包含 'dateattend' 的列 'statusout'。我一直在尝试该查询,但仍然无法工作 这两张表的关系(列名)是什么? @Squirrel 我还没做,但我认为'NIP+NAME'列可以是关系,因为与其他人不能相同 NULL 值应始终与“STATUSOUT is NULL”进行比较。 【参考方案1】:

您在内部加入表格(这里我假设它基于列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

db<>fiddle

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 想这样做,但我似乎没有任何选择。 对不起,我不知道该怎么做

以上是关于使用案例表达式从另一个表更新表的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 从另一个 Access 表更新 MS Access 表

使用 MSSQL 中的 DYNAMIC SQL 从另一个表更新一个表中的值

用单个列从另一个表更新一个表中的多个列?

oracle触发器在表中插入新行时更新新的视图行

使用公用表表达式和相关更新标记同一表中的重复数据

从另一个表数据更新表中的多个列,包括空值