2017-01-23 93 views
-1

代碼:更新子查詢

UPDATE tt_t_documents 
SET t_Doc_header_ID = (SELECT 
          MIN(dh.Doc_header_ID) 
         FROM tt_t_documents td WITH (NOLOCK) 
         JOIN Doc_header dh WITH (NOLOCK) 
          ON dh.DH_doc_number = td.t_dh_doc_number 
          AND dh.DH_sub = 1 
         JOIN Pred_entry pe WITH (NOLOCK) 
          ON pe.Pred_entry_ID = dh.DH_pred_entry 
         JOIN Doc_type dt WITH (NOLOCK) 
          ON dty.Doc_type_ID = pe.PD_doc_type 
          AND dt.DT_mode = 5 
         HAVING COUNT(dh.Doc_header_ID) = 1); 

我想更新我的專欄,但在此之前,我也想看看那裏有沒有發現只有一個ID。

這個選擇中的問題是我得到多個ID。

我該如何編寫一個查詢來更新每一行,並在同一個查詢中檢查只發現了一個id?

+1

首先 - 閱讀(nolock),你有使用它的正當理由嗎?我懷疑不是。這可能會導致無效結果,請不要在查詢中隨機使用 – Milney

+0

'我還想檢查是否只有一個ID已找到,並且您希望對該檢查的結果做什麼? – Lamak

+0

@Milney - 在這種情況下,遠遠超過意想不到的結果。它可能會導致索引損壞,因爲這是更新聲明。 https://www.mssqltips.com/sqlservertip/3172/avoid-using-nolock-on-sql-server-update-and-delete-statements/ –

回答

2

我猜,你打算是這樣的:

update td 
    set t_Doc_header_ID = min_Doc_header_ID 
    from tt_t_documents td join 
     (select DH_doc_number, min(dh.Doc_header_ID) as min_Doc_header_ID 
      from Doc_header dh join 
       Pred_entry pe 
       on pe.Pred_entry_ID = dh.DH_pred_entry join 
       Doc_type dt 
       on dty.Doc_type_ID = pe.PD_doc_type and dt.DT_mode = 5 
      where dh.DH_doc_number = td.t_dh_doc_number and dh.DH_sub = 1 
      group by DH_doc_number 
      having count(dh.Doc_header_ID) = 1 
     ) dh 
     on dh.DH_doc_number = td.t_dh_doc_number; 

使用join也意味着,你不更新當條件不匹配的值。如果您使用left join,那麼這些值將更新爲NULL(如果這是您的意圖)。

+0

謝謝這就是我想要的 –

0

我不確定我是否相信你會得到不止一個id,因爲你選擇了'min'並且沒有分組。它應該只返回Doc_header_id的最低值。

要做你在問什麼,首先,你應該有一些方法加入到update語句中的tt_t_documents表(例如,td.id == tt_t_documents.id)。

其次,您可以重新編寫它以使用from中的子查詢。喜歡的東西:

update 
    tt_t_documents 
set 
    t_Doc_header_ID = x.Doc_Header_id 
from tt_t_documents join (
     select td.id, 
      min(dh.Doc_header_ID) 
     from 
      tt_t_documents td 
      join Doc_header dh 
       on dh.DH_doc_number = td.t_dh_doc_number 
       and dh.DH_sub = 1 
      join Pred_entry pe 
       on pe.Pred_entry_ID = dh.DH_pred_entry 
      join Doc_type dt 
       on dty.Doc_type_ID = pe.PD_doc_type 
       and dt.DT_mode = 5 
     group by td.id 
     having 
      count(dh.Doc_header_ID) = 1 
    ) x on tt_t_documents.id= x.id; 

的語法可能不是完美的,我不知道你想怎麼找到doc_header_id但它會是這樣的。子查詢只會返回1個doc_header_id的值)。不知道你的表的模式,這是儘可能接近我能得到的。