使用子查询更新

时间:2017-01-23 15:03:53

标签: sql sql-server tsql

代码:

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?

2 个答案:

答案 0 :(得分:2)

我猜你打算这样的事情:

protected function authenticated()
{
    if (auth()->user()->type === 1) {
        return redirect()->route('admin.dashboard');
    } elseif (auth()->user()->type === 2) {
        return redirect()->route('client.dashboard');
    }
}

使用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(如果您的意图)。

答案 1 :(得分:0)

我不确定我是否认为你在这个选择中获得了多个身份证明,因为你正在做一个“分钟”。在它上面没有任何小组。它应该只返回Doc_header_id的最低值。

要做你要问的事情,首先,你应该有一些方法可以加入更新语句中的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的值。不知道你的表的架构,这是我能得到的尽可能接近。