Как написать сложный запрос на обновление - PullRequest
3 голосов
/ 09 июля 2011

Мне нужно обновить таблицу и установить для столбца (включенного) значение 1 со следующими правилами

  1. Должна быть 1 (и никогда не 0 или> 1) запись с включенным значением 1 для каждогоEmployee_Guid.
  2. Следует выбрать удаленную запись, равную 0 (должна быть только одна запись или нет записей с удаленными, равными 0 для Employee_Guid), чтобы установить включенным значение 1.
  3. Если всезаписи удалили, установив в 1, следует использовать запись с самым последним Create_Date_Time
  4. Если есть связь с датой создания времени, любая запись группы связывания может быть установлена ​​в 1, но только одна из них может бытьused.

Если существует более 1 записи с удаленным значением 0, я хотел бы выдать ошибку, поскольку это недопустимое состояние.

Вот то, что у меня есть до сих пор

if(exists(select count(employee_guid) from Employees_M where deleted = 0 group by employee_guid having count(employee_guid) > 1))
    RAISERROR('More than one record has deleted set to 0')
Update Employees_M set [ENABLE] = 0

select * into #t from employees_m where deleted = 0
insert into #t select * from employees_m where employee_guid not in (select employee_guid from #t) 
                                         and --fulfill rules 3 and 4

Update Employees_M set [ENABLE] = 1
where pk_guid in (select pk_guid from #t)

Вот структура таблицы

PK_Guid (primary key, uniuque, uniuqueidenitfier, not null)
Employee_Guid (uniuqueidenitfier, not null)    
Deleted (bit, not null)
Enable (bit, not null)
Create_Date_Time (datetime defaults to getdate(), not null)

Это не просто вопрос "Покажи мне код".Я хочу научиться делать это правильно, так что ссылки или примеры, которые похожи, но не решают проблему, также будут оценены.

Ответы [ 2 ]

1 голос
/ 09 июля 2011

В этом сценарии часто можно использовать row_number.Предложение order by позволяет вам назначать приоритеты.В вашем случае deleted asc и Create_Date desc могут соответствовать требованиям.

Вот пример использования row_number в запросе на обновление:

update  emp
set     enabled = case when rn = 1 then 1 else 0 end
from    (
        select  row_number() over (partition by employee_guid 
                                   order by deleted, Create_Date desc) as rn
        ,       *
        from    @employees
        ) emp

Полный пример на SE Data.

0 голосов
/ 09 июля 2011

Сложный вопрос. Попробуйте, надеюсь, это сработает.

if(exists(select 1 from Employees_M where deleted = 0  having count(employee_guid) > 1))
    RAISERROR('More than one record has deleted set to 0')

Update Employees_M E
set [ENABLE] = 1
WHERE EXISTS 
(
  SELECT 1 
  FROM Employees_M  
  WHERE E.employee_guid = employee_guid 
  AND (DELETED = 0 OR DELETED IS NULL)
) --SECOND POINT
OR EXISTS 
(
  SELECT 1 
  FROM Employees_M  
  WHERE E.employee_guid = employee_guid 
  AND ENABLE <> 1 -- 4 POINT 
  AND Create_Date_Time =  
  (
    SELECT DISTINCT(MAX(Create_Date_Time)) 
    FROM Employees_M 
    WHERE E.employee_guid = employee_guid 
  )
  HAVING COUNT(employee_guid) = SUM(deleted) --3 POINT
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...