2017-01-23 91 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的值)。不知道你的表的模式,这是尽可能接近我能得到的。