2016-07-15 8 views
0

Ich verwende MS SQL. Ich möchte eine bestimmte Zeile in einer Tabelle mit Daten aus einer anderen Tabelle aktualisieren. Ich habe eine Abfrage erstellt, die die bestimmte Zeile enthält, die ich aktualisieren möchte. Bitte beachten Sie, dass ich eine Select-Abfrage verwendet habe, um die bestimmte Zeile auszuwählen, die aktualisiert werden muss. Beachten Sie auch, dass eine Unterabfrage verwendet wird, um die richtige Zeile zu erhalten. Das macht es für mich schwierig, sich in eine festgelegte Aussage einzufügen.Aktualisieren Sie eine bestimmte Zeile mit Daten aus einer anderen Tabelle

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 

Das gibt mir

enter image description here

Jetzt habe ich die Übersicht Spalte mit Daten aus einer anderen Tabelle aktualisieren möchten. Diese Auswahlabfrage gibt mir die Informationen, die ich verwenden möchte, um die andere Tabelle zu aktualisieren.

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

Das gibt mir

enter image description here

Kann mir bitte jemand mit der Syntax helfen, den Überblick Spalte aus der Zeile in der ersten Abfrage erhalten zu aktualisieren oben mit der Übersicht Spalte in der zweiten Abfrage enthalten wo der Query1.AssessmentCode = Query2.AssessmentCode aus beiden Abfragen.

Wie kann ich eine set-Anweisung verwenden, aber dann die erste Abfrage oben verwenden, um zu sagen, welche Zeile zu setzen? Andere ähnliche Fragen verwenden nur einen einfachen Satz und dann ein Feld ohne irgendwelche where-Anweisungen.

+0

Sorry - ich bin mit MS SQL –

+0

Mögliche Duplikat von [Wie Daten in einer Tabelle aktualisieren von Daten in einer anderen Tabelle in SQL Server 2005 entspricht] (http://stackoverflow.com/questions/4920394/how-to-update-data-in-one-table-from-korresponding-data-in-another-table-in-sql) –

+0

Ja, ich habe mir das angesehen aber ich bin nicht sicher, wie man die erste auserwählte Abfrage einbaut, um die korrekte Reihe zu erhalten zu setzen. –

Antwort

1

Gerade diese beiden in einem aktualisierbaren CTE beitreten:

;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

Vielen Dank. Das funktioniert gut. Habe CTEs nicht viel benutzt und das ist eine nette einfache Lösung. –

1

Versuchen folgende:

;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) 

Bitte beachten Sie, dass, sollte hier AssessmentCode Primärschlüssel sein.

Verwandte Themen