2015-06-16 2 views
2

Я бегу следующий сценарий -Предупреждение: Нулевое значение устраняется агрегатной или другой SET операции

declare @eventname VARCHAR(64) 
declare @eventid INT 

set @eventname = 'event123' 
set @eventid = (select tm.trgmst_id from trgmst tm where tm.trgmst_name = @eventname) 

declare @trgjobmax INT 
set @trgjobmax = (select max(trgjob_id) from trgjob) 

declare @jobid TABLE (jobmst_id INT, trgjob_order INT) 

insert into @jobid (jobmst_id, trgjob_order) 
    select 
     jm.jobmst_id, max(tj.trgjob_order) 
    from 
     jobmst jm 
    left outer join 
     trgjob tj on tj.jobmst_id = jm.jobmst_id 
    inner join 
     workgrp wg on wg.workgrp_id = jm.jobmst_owner 
    where 
     wg.workgrp_name in ('group1', 'group2', 'group3') 
     and jm.jobmst_type = 2 
     and jm.jobmst_dirty <> 'X' 
     and jm.jobmst_id NOT IN (select tj.jobmst_id 
           from trgjob tj 
           where tj.trgmst_id = @eventid) 
    group by 
     jm.jobmst_id 
    order by 
     jm.jobmst_id desc 

Проблема я получаю это сообщение -

Предупреждение: Null значение исключается агрегатом или другим оператором SET .

Причина в том, что не всегда гарантируется наличие значения trgjob_order, поэтому он отображается как NULL. Затем я должен запустить следующий скрипт обновления в той же транзакции, и, похоже, он работает нормально.

update @jobid 
set trgjob_order = 0 
where trgjob_order IS NULL 

Есть ли способ написать это более элегантно? Данные, которые мне даны, выглядят правильно, поэтому я беру предупреждение как только это ... Это предупреждение, но его можно игнорировать, потому что я выполняю обновление POST для замены NULL на 0.

ответ

3

Использование ISNULL

select jm.jobmst_id, ISNULL(max(tj.trgjob_order), 0) from jobmst jm 

Ваш полный сценарий

declare @eventname VARCHAR(64) 
declare @eventid INT 
set @eventname = 'event123' 
set @eventid = (select tm.trgmst_id from trgmst tm where tm.trgmst_name = @eventname) 
declare @trgjobmax INT 
set @trgjobmax = (select max(trgjob_id) from trgjob) 
declare @jobid TABLE (jobmst_id INT, trgjob_order INT) 
insert into @jobid (jobmst_id, trgjob_order) 
select jm.jobmst_id, ISNULL(max(tj.trgjob_order), 0) from jobmst jm 
left outer join trgjob tj on tj.jobmst_id = jm.jobmst_id 
inner join workgrp wg on wg.workgrp_id = jm.jobmst_owner 
where wg.workgrp_name in ('group1', 'group2', 'group3') 
     and jm.jobmst_type = 2 and jm.jobmst_dirty <> 'X' and jm.jobmst_id 
NOT IN (
select tj.jobmst_id from trgjob tj 
where tj.trgmst_id = @eventid 
) 
group by jm.jobmst_id 
order by jm.jobmst_id desc 
+0

Это работает! не знаю, почему я этого раньше не заметил. FYI он все еще дает предупреждение, которое я не знаю, почему ... – whoisearth

+1

Возможно, вы получаете 'NULL' в другом месте. Поэтому попробуйте найти, где вы получаете значение «NULL», и вместо этого используйте функцию «ISNULL» return '0' – sqluser

0

Я думаю, что вы хотите MAX (ISNULL (колонка, 0)) не ISNULL (MAX (Column), 0), это удалит нуль, прежде чем он агрегируются.

Он отлично работает в этом случае, с MAX, но осторожно делать это с COUNT, как он будет производить различные результаты (учитывая нулевой не учитывается и значение ISNULL'ed есть)

Смежные вопросы