2016-07-15 105 views
0

我正在使用MS SQL。我想用另一个表中的数据更新表格中的特定行。我创建了一个查询来获取我想要更新的特定行。请注意,我使用了一个选择查询来选择需要更新的特定行。另请注意,有一个子查询用于获取正确的行。对我而言,这很难将其纳入一套陈述中。使用另一个表中的数据更新特定行

select tbl1.assessmentcode, tbl1.Overview from subjectassessmentareas tbl1 
inner join 
( 
select assessmentcode,MIN(areaseq) as minassessarea from subjectassessmentareas 
where resultgroup = 'PR_Yr8_2' and ResultType = 'KUS_5' 
group by AssessmentCode 
) tbl2 
on tbl1.AssessmentCode = tbl2.AssessmentCode and tbl1.AreaSeq = tbl2.minassessarea 
where fileyear = 2016 and filesemester = 3 

这给了我

enter image description here

现在我想更新与另一个表中的数据一览表中。这个选择查询为我提供了我想用来更新其他表的信息。

SELECT AssessmentCode, Overview 
FROM SubjectAssessments 
WHERE (ClassCampus = 'S') 
    and (FileYear = 2015) 
    and (FileSemester = 3) 
    and filetype = 'A' 
    and AssessmentCode like '08%' 

这给了我

enter image description here

是否有人可以帮助我的语法来更新从第一个查询与包含在第二查询一览表中得到上述行概述列这两个查询中的Query1.AssessmentCode = Query2.AssessmentCode。

如何使用set语句,然后使用上面的第一个查询来说明要设置哪个行?其他类似的问题只是使用一个简单的集合,然后是一个没有where语句的字段。

+0

对不起 - 我使用的MS SQL –

+0

可能的复制[如何在SQL Server中的另一个表对应的数据更新一个表中的数据2005]( http://stackoverflow.com/questions/4920394/how-to-update-data-in-one-table-from-corresponding-data-in-another-table-in-sql) –

+0

是的,我看过这个但我不知道如何合并第一个选择查询来获取正确的行设置。 –

回答

1

在一个可更新的CTE刚刚加入这两个:

;with x as (
    select tbl1.assessmentcode, tbl1.Overview 
    from subjectassessmentareas tbl1 
    inner join 
    ( 
    select assessmentcode,MIN(areaseq) as minassessarea from subjectassessmentareas 
    where resultgroup = 'PR_Yr8_2' and ResultType = 'KUS_5' 
    group by AssessmentCode 
    ) tbl2 
    on tbl1.AssessmentCode = tbl2.AssessmentCode and tbl1.AreaSeq = tbl2.minassessarea 
    where fileyear = 2016 and filesemester = 3 
), 
y as (
    SELECT AssessmentCode, Overview 
    FROM SubjectAssessments 
    WHERE (ClassCampus = 'S') 
     and (FileYear = 2015) 
     and (FileSemester = 3) 
     and filetype = 'A' 
     and AssessmentCode like '08%' 
), 
z as (
    select x.Overview as dest, y.Overview as src 
    from x join y on x.AssessmentCode = y.AssessmentCode 
) 
update z set dest = src 
+0

非常感谢。这很好。还没有使用CTE,这是一个很好的简单解决方案。 –

1

尝试以下操作:

;WITH cteBaseInfo AS 
(
    SELECT AssessmentCode, Overview 
    FROM SubjectAssessments 
    WHERE (ClassCampus = 'S') 
     and (FileYear = 2015) 
     and (FileSemester = 3) 
     and filetype = 'A' 
     and AssessmentCode like '08%' 
) 

, cteToBeUpdated AS 
(
    select tbl1.assessmentcode, tbl1.Overview from subjectassessmentareas tbl1 
    inner join 
    ( 
     select assessmentcode,MIN(areaseq) as minassessarea from subjectassessmentareas 
     where resultgroup = 'PR_Yr8_2' and ResultType = 'KUS_5' 
     group by AssessmentCode 
    ) tbl2 
    on tbl1.AssessmentCode = tbl2.AssessmentCode and tbl1.AreaSeq = tbl2.minassessarea 
    where fileyear = 2016 and filesemester = 3. 
) 

UPDATE subjectassessmentareas 
SET  Overview = (SELECT Overview FROM cteBaseInfo WHERE AssessmentCode = subjectassessmentareas.AssessmentCode) 
WHERE AssessmentCode IN (SELECT AssessmentCode FROM cteToBeUpdated) 

请注意,这里AssessmentCode应该是主键。