SQL UPDATE使用两个连接的子查询

时间:2015-03-31 19:55:32

标签: sql sql-server sql-update subquery inner-join

我写了一个查询,它执行两个子查询的内连接。第一个子查询的别名为“SRC”,另一个子查询的别名为“DEST”。我想要做的是使用表Nominee_Committee_Vote(SRC子查询的一部分)中的值更新表NomineeActionLegislatorVoteDetail(DEST子查询的一部分)中的一些字段。它很容易,但我无法弄清楚如何做到这一点。有没有人有什么建议?任何帮助将不胜感激。

这是我写的查询:

select * 
from (
    select  ncv.*,
        na.NomineeActionId,
        l.LegislatorId
    from ongoing..Nominee_Committee_Vote ncv
    inner join azleg..NomineeAction na on
        ncv.session_id    = na.x_session_id   and
        ncv.committee_id  = na.x_committee_id and
        ncv.agency_id     = na.x_agency_id    and
        ncv.position_id   = na.x_position_id  and
        ncv.nominee_id    = na.x_nominee_id   and
        ncv.received_date = na.x_received_date
    inner join status..session s on
        ncv.session_id    = s.session_id
    inner join azleg..Legislator l on
        ncv.member_id     = l.x_member_id     and
        s.legislature     = l.LegislatureId
) SRC
inner join (
    select votedetail.*
    from azleg..NomineeActionLegislatorVoteDetail votedetail
    inner join azleg..NomineeAction nom_action on
        votedetail.NomineeActionId = nom_action.NomineeActionId
) DEST on
    SRC.agency_id     = DEST.x_agency_id     and
    SRC.position_id   = DEST.x_position_id   and
    SRC.nominee_id    = DEST.x_nominee_id    and
    SRC.received_date = DEST.x_received_date and
    SRC.session_id    = DEST.x_session_id    and
    SRC.committee_id  = DEST.x_committee_id  and
    SRC.member_id     = DEST.x_member_id
where   SRC.NomineeActionId <> DEST.NomineeActionId
   OR   SRC.LegislatorId <> DEST.LegislatorId
   OR   SRC.Vote <> DEST.Vote

2 个答案:

答案 0 :(得分:0)

您可以在子查询前插入更新

UPDATE NomineeActionLegislatorVoteDetail 
SET NomineeActionLegislatorVoteDetail.COLUMNNAME = src.VALUE
--SubQueriesBelow
from
(select ncv.*, na.NomineeActionId, l.LegislatorId from ongoing..Nominee_Committee_Vote ncv
inner join azleg..NomineeAction na on
ncv.session_id = na.x_session_id and
ncv.committee_id = na.x_committee_id and
ncv.agency_id = na.x_agency_id and
ncv.position_id = na.x_position_id and
ncv.nominee_id = na.x_nominee_id and
ncv.received_date = na.x_received_date
inner join status..session s on
ncv.session_id = s.session_id
inner join azleg..Legislator l on
ncv.member_id = l.x_member_id and
s.legislature = l.LegislatureId) SRC
inner join
(select votedetail.* from azleg..NomineeActionLegislatorVoteDetail votedetail
inner join azleg..NomineeAction nom_action on
votedetail.NomineeActionId = nom_action.NomineeActionId) DEST on
SRC.agency_id = DEST.x_agency_id and
SRC.position_id = DEST.x_position_id and
SRC.nominee_id = DEST.x_nominee_id and
SRC.received_date = DEST.x_received_date and
SRC.session_id = DEST.x_session_id and
SRC.committee_id = DEST.x_committee_id and
SRC.member_id = DEST.x_member_id
where SRC.NomineeActionId <> DEST.NomineeActionId
OR SRC.LegislatorId <> DEST.LegislatorId
OR SRC.Vote <> DEST.Vote

看起来更新是在子查询中的一个表上,因此可以重新计算一个子查询

答案 1 :(得分:0)

我已经调整了您的查询布局,以便更好地披露子查询的开始和结束位置。在您的DEST子查询中,您join NomineeAction但是您没有从中选择任何列,因此只有{em>过滤来自NomineeActionLegislatorVoteDetail的行NomineeAction专栏。基于此,我会像这样编写NomineeActionLegislatorVoteDetail查询:

update