代码:
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?
答案 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的值。不知道你的表的架构,这是我能得到的尽可能接近。