Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Обновление записей исключая не полностью выбранных


Автор: SotGE 11.6.2013, 11:11
Есть записи у которых есть номера и есть подномеры, допустим записи:

Дата создания | Дата изменения | Номер | Подномер

02.06.2013 | 06.06.2013 | 1 | 1
02.06.2013 | 07.06.2013 | 1 | 2
02.06.2013 | 08.06.2013 | 1 | 3

03.06.2013 | 07.06.2013 | 2 | 1
03.06.2013 | 08.06.2013 | 2 | 2

04.06.2013 | 06.06.2013 | 3 | 1
04.06.2013 | 07.06.2013 | 3 | 2

Допустим (сегодня 09.06.2013), мы выбрали записи за последнии 3 дня, 09.06.2013 включительно:

02.06.2013 | 07.06.2013 | 1 | 2
02.06.2013 | 08.06.2013 | 1 | 3

03.06.2013 | 07.06.2013 | 2 | 1
03.06.2013 | 08.06.2013 | 2 | 2

04.06.2013 | 07.06.2013 | 3 | 2

Эти записи выбраны по дате изменения, выбрали мы последнии записи, нужно присвоить им в параметр STATUS, значение DELETED, НО не всем, только тем у которых вабрана вся запись по номеру, т.е. вся запись целиком, в данном случае нельзя присваивать записям по номерам 1 и 3, а вот номеру 2 нужно присвоить этот статус, т.к. запись выбрана целиком все подномеры данного номера.

Если же мы выбираем записи за последнии 4 дня, то в данном случае мы выбрали все записи по 06.06.2013

02.06.2013 | 06.06.2013 | 1 | 1
02.06.2013 | 07.06.2013 | 1 | 2
02.06.2013 | 08.06.2013 | 1 | 3

03.06.2013 | 07.06.2013 | 2 | 1
03.06.2013 | 08.06.2013 | 2 | 2

04.06.2013 | 06.06.2013 | 3 | 1
04.06.2013 | 07.06.2013 | 3 | 2

и проверяем выбраны ли все записи с данными номерами, если нет, то не присваиваем им значение, если да то присваеваем, в данном случае всем присваеваем статус DELETED.

А теперь пример выборки:


Код

SELECT 
        MAX(dbo.weighet.MODIFY_DATE) AS MODIFY_DATE,
        MAX(dbo.weighet.WEIGHET_NO) AS WEIGHET_NO,
        MAX(dbo.weighet.WEIGHET_PART) AS WEIGHET_PART,
        dbo.weighet.CREATED
    FROM dbo.weighet
    WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=14
        AND dbo.weighet.WEIGHET_NO=dbo.weighet.WEIGHET_NO
        AND dbo.weighet.CREATED=dbo.weighet.CREATED
        AND dbo.weighet.STATUS<>N'DELETED'
    GROUP BY CREATED ORDER BY WEIGHET_PART DESC


Не уверен в правильности работы, я выбрал все записи у которых нет статуса DELETED и те записи у которых номера WEIGHET_NO равны и даты создания CREATED тоже равны (т.к. возможно через какое-то время может создастся такая же запись с таким же номером, но дата создания будет другая). Сортировал я их по подномеру WEIGHET_PART, а вот сгруппировал их по дате создания для удобства, в UPDATE наверняка такое не нужно. MODIFY_DATE - это дата изменения

мне нужно подобное сделать с UPDATE, что-то типо такого:


Код

UPDATE dbo.weighet
SET STATUS = N'DELETED', MODIFY_DATE=GETDATE()
WHERE DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=14
AND dbo.weighet.STATUS<>N'DELETED'


Но с условием, выше описанным, что нельзя удолять те записи которые не выбраны полностью, т.е. с этими же номерами и датами создания, если хоть 1 запись не входит в период времени, то она не удоляется, т.е. не присваевает им значения DELETED 

Автор: Akina 11.6.2013, 11:26
Код

...
and number = (
select number
from table
group by number
having count(subnumber) = 3
)

Автор: SotGE 11.6.2013, 11:36
Цитата(Akina @ 11.6.2013,  11:26)
Код

...
and number = (
select number
from table
group by number
having count(subnumber) = 3
)

а если подномеров может быть N (бесконечно) колличество?

Автор: Zloxa 11.6.2013, 11:44
Цитата(SotGE @  11.6.2013,  12:11 Найти цитируемый пост)
только тем у которых вабрана вся запись по номеру, т.е. вся запись целиком


Код

UPDATE t
SET STATUS = N'DELETED', MODIFY_DATE=GETDATE()
from dbo.weighet as t
WHERE --DATEDIFF(DAY,dbo.weighet.MODIFY_DATE,GETDATE())<=14
      -- чтобы мог быть испльзован индекс, если он есть, условие переписываем так, 
      -- чтобы столбец в критерии отбора не был аргументом функции
      t.MODIFY_DATE >= DATEADD(DAY,-14,GETDATE())
      and t.MODIFY_DATE <= DATEADD(DAY,14,GETDATE())

      AND t.STATUS<>N'DELETED'
      -- проверяем, что для отобранной строки отсутствуют активные записи вне заданного диапазона
      and not exists (select null 
                        from dbo.weighet as s 
                        where t.[номера]= s.[номера] 
                             and (s.MODIFY_DATE<DATEADD(DAY,-14,GETDATE())
                                  or s.MODIFY_DATE>DATEADD(DAY,14,GETDATE())
                             AND s.STATUS<>N'DELETED'
                     )


Автор: SotGE 11.6.2013, 11:53
Цитата(Zloxa @  11.6.2013,  11:44 Найти цитируемый пост)
where t.[номера]= s.[номера]


Можно пожалуйста поподробнее здесь

Автор: Zloxa 11.6.2013, 12:00
Цитата(SotGE @ 11.6.2013,  12:53)
Цитата(Zloxa @  11.6.2013,  11:44 Найти цитируемый пост)
where t.[номера]= s.[номера]


Можно пожалуйста поподробнее здесь

stfg https://www.google.ru/search?q=%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9+%D0%BF%D0%BE%D0%B4%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81&oq=%D0%BA%D0%BE%D1%80%D0%B5%D0%BB%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9+%D0%BF%D0%BE&aqs=chrome.1.57j0.4702j0&sourceid=chrome&ie=UTF-8

Автор: Akina 11.6.2013, 13:34
Цитата(SotGE @  11.6.2013,  12:36 Найти цитируемый пост)
если подномеров может быть N (бесконечно) колличество? 

Получи его подзапросом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)