sql - 使用案例表达式从另一个表更新表
问题描述
当'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
这是示例输入
这是示例输出
解决方案
您内部加入表格(这里我假设它基于列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
推荐阅读
- java - 这个问题的答案是什么?
- php - 如何使用php在标题(“位置:”)中隐藏一段文本
- java - 超级关键字歧义
- python - Kivy 时钟和弹出窗口
- ruby-on-rails - 带参数的部分渲染性能在 rails
- python - 使用python将类导入另一个文件时出错
- mvvm - 如何通过 ViewModel 实现的 onclick Binding Adapter 获取 Position & View 信息?
- http - 建议保留 nonce 的时间?
- deep-learning - 在 Stacked Denoising Autoencoder 中在哪里添加噪声?
- rust - 结构使用关联函数重新分配多个字段的干净方式?