Tenho o seguinte cenário:
eu tenho
- uma tabela de ativos com colunas padrão
- uma tabela de ativos de hardware com colunas de extensão
- uma tabela de histórico onde todas as alterações em um ativo são armazenadas com ID do ativo, nome do campo, data, novo valor
- uma tabela de contato
Desejo definir um campo em ativos de hardware chamado "first_usage" para a data mais antiga de alteração do campo de contato (chamado "resource_contact") quando o novo valor for um contato com um ID de usuário (ou seja, nenhum usuário ou grupo técnico).
Uma dificuldade foi que nenhum ID é armazenado no "novo valor", mas uma sequência combinada de nome, nome do meio e sobrenome (no caso de mudança de contato).
Minha primeira tentativa de uma consulta se parece com isso:
UPDATE dbo.asset_z_hardware
SET first_usage = (
select min(history.com_dt)
from dbo.nr_com history,
dbo.ca_contact contact
where history.attr_name = 'resource_contact' AND
history.com_par_id = own_resource_uuid AND
contact.userid IS NOT NULL AND
(history.new_value = '' +
case when contact.last_name is not null then contact.last_name end +
case when contact.first_name is not null then ', ' + contact.first_name end +
case when contact.middle_name is not null then ' ' + contact.middle_name end
)
)
Isso pareceu funcionar muito bem, embora apenas alguns ativos tenham sido atualizados com uma data (provavelmente eu preciso verificar a comparação de strings e os contatos que foram alterados).
Mas então percebi que só deveria atualizar apenas ativos ativos ! O sinalizador "inativo" está na tabela de ativos principal chamada "ca_owned_resource". Infelizmente, após adicionar a nova condição, os primeiros valores de uso foram todos definidos para a mesma data !!! Por quê? Não encontrei meu erro.
Esta é a segunda consulta com sinalizador "inativo" e link entre hardware e ativo principal:
UPDATE dbo.asset_z_hardware
SET first_usage = (
select min(history.com_dt)
from dbo.nr_com history,
dbo.ca_contact contact,
dbo.ca_owned_resource res
where history.attr_name = 'resource_contact' AND
res.inactive = 0 AND res.own_resource_uuid = own_resource_uuid AND
history.com_par_id = own_resource_uuid AND
contact.userid IS NOT NULL AND
(history.new_value = '' +
case when contact.last_name is not null then contact.last_name end +
case when contact.first_name is not null then ', ' + contact.first_name end +
case when contact.middle_name is not null then ' ' + contact.middle_name end
)
)
Agradeço qualquer ajuda e sugestões para o erro de apenas uma data, também para melhorar o resto, se houver alguma ideia.
Seu problema é porque acha que
own_resource_uuid
em sua subconsulta éres.own_resource_uuid
, nãoasset_z_hardware.own_resource_uuid
. Se você especificá-lo completamente, ele não deve ser ambíguo e o SQL saberá o que você pretendia.Antes de você apresentar
res
não havia mais nada que pudesse ser. O SQL assumirá que você quer dizer uma coluna na subconsulta local, se houver uma lá.