我有以下情况:
我有
- 带有标准列的资产表
- 带有扩展列的硬件资产表
- 一个历史表,其中对资产的所有更改都与资产 ID、字段名称、日期、新值一起存储
- 联系表
当新值是具有用户 ID 的联系人(即没有技术用户或组)时,我想将硬件资产中名为“first_usage”的字段设置为联系人字段(称为“resource_contact”)的最早更改日期。
一个困难是没有 ID 存储在“新值”中,而是存储了名字、中间名和姓氏的组合字符串(以防联系人更改)。
我第一次尝试查询如下所示:
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
)
)
这似乎工作得很好,虽然只有一些资产更新了日期(可能我需要检查同时更改的字符串比较和联系人)。
但后来我意识到我应该只更新活动资产!“inactive”标志位于名为“ca_owned_resource”的主资产表中。不幸的是,添加新条件后,第一次使用值都设置为相同的日期!怎么来的?我没有发现我的错误。
这是第二个带有“inactive”标志以及硬件和主要资产之间链接的查询:
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
)
)
对于只有一次约会错误的任何帮助和建议,我将不胜感激,如果有任何想法,也可以改进其余部分。
您的问题是因为它认为
own_resource_uuid
在您的子查询中 isres.own_resource_uuid
, notasset_z_hardware.own_resource_uuid
。如果你完全指定它,它应该是明确的,SQL 会知道你想要什么。在你介绍之前
res
,没有别的可能了。SQL 将假定您的意思是本地子查询中的一列(如果有的话)。