使用案例表达式从另一个表更新表
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 表