Обновить таблицу из другой таблицы с помощью Case Expression - PullRequest
1 голос
/ 11 февраля 2020

Я хочу обновить столбец «statusout» в таблице «dailydatawh» из таблицы «dailydata» в столбце «dateattend», когда «statustype» = out

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

TABLE DAILYDATA

TABLE DAILYDATAWH

-

После того, как я попробую следующий ответ

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'

Этот запрос работает, но когда я ввожу новые данные ( NIP, NAME, DEPARTMENT, DATEATTEND, STATUSTYPE) в таблице DAILYDATA, новое значение в 'STATUSOUT' (таблица DAILYDATAWH) по-прежнему отображается в предыдущей дате

TABLE DAILYDATA TABLE 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

CURRENT OUTPUT

Это пример ввода

EXAMPLE input TABLE

Это пример выборки

EXAMPLE OUTPUT TABLE

1 Ответ

1 голос
/ 11 февраля 2020

Вы внутренне присоединяетесь к таблицам (здесь я предполагаю, что он основан на столбце 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

...