Sql-Server
將 SELECT 結果集的 UPDATE 列更新為 MIN - 出了什麼問題?
我有以下情況:
我有
- 帶有標準列的資產表
- 帶有擴展列的硬體資產表
- 一個歷史表,其中對資產的所有更改都與資產 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 將假定您的意思是本地子查詢中的一列(如果有的話)。