Sql-Server

將 SELECT 結果集的 UPDATE 列更新為 MIN - 出了什麼問題?

  • October 18, 2019

我有以下情況:

我有

  • 帶有標準列的資產表
  • 帶有擴展列的硬體資產表
  • 一個歷史表,其中對資產的所有更改都與資產 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在您的子查詢中 is res.own_resource_uuid, not asset_z_hardware.own_resource_uuid。如果你完全指定它,它應該是明確的,SQL 會知道你想要什麼。

在你介紹之前res,沒有別的可能了。SQL 將假定您的意思是本地子查詢中的一列(如果有的話)。

引用自:https://dba.stackexchange.com/questions/251460