2016-04-14 13 views
1

Meine grundlegende Frage hat mit der Aktualisierung mehrerer Spalten gleichzeitig von angegebenen Werten in meiner Abfrage zu tun. Der Grund, warum ich dies tun möchte, ist, dass ich meine Werte aus einer ginormous-Tabelle aktualisiere, so dass ich sie nur einmal abfragen möchte, um die Laufzeit zu reduzieren. Hier ist ein Beispiel eines Beispiels select-Anweisung, die den Wert zurückgibt ich für nur eine der Spalten möchte ich brauche zu aktualisieren:TSQL - Where Anweisungen für mehrere Spalten in Update

select a.Value 
from Table1 
left outer join 
(
select ID, FilterCol1, FilterCol2, Value 
from Table2 
) a on a.ID = Table1.ID 
where {Condition1a on FilterCol1} 
and {Condition2a on FilterCol2} 

Um bei mehreren Spalten zu aktualisieren, sobald Ich mag wäre in der Lage sein, etwas zu tun, wie diese (aber es gibt NULL):

Update T1 
set T1Value1 = (select a.Value where {Condition1a on FilterCol1} 
and {Condition2a on FilterCol2) 
,T1Value2 = (select a.Value where {Condition1b on FilterCol1} 
and {Condition2b on FilterCol2}) 
from Table1 T1 
left outer join 
(
select ID, FilterCol1, FilterCol2, Value 
from Table2 
) a on a.ID = Table1.ID 

Jede Hilfe dieses heraus herauszufinden wäre sehr dankbar, lassen Sie mich wissen, wenn Sie Fragen haben oder wenn ich Fehler gemacht. Vielen Dank!

EDIT: Ich denke, ich habe das Problem identifiziert, aber ich bin mir einer Lösung noch nicht sicher. Ich denke, das Problem zu sehen erfordert ein wenig mehr Kontext: Die Auswahl aus Tabelle 2 ist eigentlich ein Unpivot auf einem großen Tisch. Dies bedeutet, dass bei Anwendung der left outer join mehrere Zeilen für eine bestimmte ID vorhanden sind. Was die von Earl vorgeschlagene Case-Anweisung zu tun scheint (und ich nehme an, dass dies auch mit der where-Klausel geschieht), vergleicht meine Bedingungen nur mit der ersten Zeile der Spalten von a. Da meine Bedingungen helfen sollen zu bestimmen, welche der Zeilen von a gewählt wird, werden sie immer falsch für die erste Zeile auswerten (ich weiß das nur aus dem, was ich über die Daten weiß), daher meine fortwährenden NULL Werte. Kennt jemand eine Problemumgehung, um die anderen Zeilen in a zu betrachten?

Antwort

0
UPDATE T1 
SET T1Value1 = CASE WHEN (FilterCol1 = Condition1a AND FilterCol2 = Condition2a) THEN a.Value END, 
    T1Value2 = CASE WHEN (FilterCol1 = Condition1b AND FilterCol2 = Condition2b) THEN a.Value END 

FROM Table1 T1 
left outer join 
     (
     select ID, FilterCol1, FilterCol2, Value 
     ) a on a.ID = Table1.ID 
+0

Danke für die Antwort Earl, leider hat das für mich nicht funktioniert (immer noch Null). Ich frage mich, ob das tatsächlich filtern würde, welche Werte in 'T1ValueX' eingegeben werden oder welche Zeilen von' Table1' aktualisiert werden. Macht es einen Unterschied, dass 'FilterCol (1,2)' Spalten von 'Table2' sind, aber' Bedingung (1,2) (a, b, ...) 'sich Werte in' Table1' anschauen? –

+0

Können Sie Tabellen und Beispieldaten hinzufügen? – EarlOfEnnui

+0

Die WHERE-Klausel filtert die Zeilen aktualisiert. Der CASE würde den Wert auswählen. Es spielt keine Rolle, ob Sie die Tabellen korrekt verknüpft haben, aus welcher Tabelle die Werte stammen. Tabellen zu verknüpfen ist vielleicht die am leichtesten missverstandene Aspekte für Leute, die SQL neu sind. Ich schlage vor, in der Zukunft, wenn Sie Fragen haben, eine Erstellung von Tabellen und Testdaten hinzuzufügen. – EarlOfEnnui