2016-12-08 16 views
1

Ich möchte ein Feld in einer Tabelle mit einer einfachen Case-Anweisung aktualisieren. Ich möchte diese Case-Anweisung jedoch nur auf eine ausgewählte Anzahl von Zeilen anwenden. Die einzige Möglichkeit für mich zu bestimmen, was diese Zeilen sind, besteht darin, sich einer anderen Tabelle anzuschließen und dann einige Bedingungen basierend auf den Feldern in dieser zweiten Tabelle zu haben.SQL Server Update Tabelle 1 mit Bedingung in Tabelle 2

Zum Beispiel, das ist, wie ich dachte, es würde funktionieren ...

update table1 
set table1.field1 = case 
    when table1.field1 = 'foo' then 'bar' 
    else 'foobar' 
end 
join table2 on table1.obj_id=table2.id 
where table2.field1 = 'fizzbuzz' 
and table2.field2 in ('foo', 'bar', 'foobar') 

Es scheint jedoch, dass man nicht eine Verknüpfung innerhalb der Update-Anweisung wie diese haben kann. Zumindest nicht in MS SQL.

Ich habe versucht, nach einer Antwort zu suchen, aber alles, was ich finden kann, ist Leute, die versuchen, eine Tabelle mit Daten von einer anderen Tabelle einschließlich eines Joins zu aktualisieren, wobei man eine "from" -Aussage wo meine Join ist und dann eine geschachtelte auswählen Aussage mit einem Join in diesem. Ich bin mir nicht sicher, dass dies eine Lösung für mich ist. Ich möchte nicht von einer anderen Tabelle aktualisieren, ich möchte basierend auf einer anderen Tabelle filtern.

Die einzige Lösung, die ich jetzt denken kann, ist eine Lösung mit zwei Abfragen, indem zuerst eine Liste von obj_id s abgerufen und dann nur diese IDs in einer zweiten Update-Anweisung ausgewählt werden. Nicht ideal.

+0

hat es eine FROM-Klausel müssen? – McNets

+0

"Es sieht jedoch so aus, als könnte man in der update-Anweisung keinen Join haben. Zumindest nicht in MS SQL." . Das ist nicht der Fall. – AK47

Antwort

2

Sie können. Die Syntax erfordert from:

update t1 
    set field1 = (case when t1.field1 = 'foo' then 'bar' else 'foobar' end) 
    from table1 t1 join 
     table2 t2 
     on t1.obj_id = t2.id 
    where t2.field1 = 'fizzbuzz' and 
      t2.field2 in ('foo', 'bar', 'foobar'); 
+0

Also wird das definitiv tun, was ich will? Was es für mich klingt, ist, dass ich die ursprüngliche Tabelle aktualisieren möchte, und dann die zweite Tabelle in der from-Klausel ... aber die ursprüngliche Tabelle wird nicht gefiltert, so dass ich alle Zeilen aktualisieren werde, was definitiv nicht das ist, was ich wollen. Aber ich denke, das Verhalten unterscheidet sich von dem, wie es sich anhört. – Luke

+1

@Luke. . . 't1' ist der Tabellenalias für die Tabelle, die Sie aktualisieren möchten. Ich empfehle Ihnen dringend, Tabellenaliasnamen für 'update' zu ​​verwenden und die vollständig formatierte Tabellenlogik in die 'from'-Klausel einzufügen. Dies macht es viel einfacher, in ein 'select' zu transformieren, um zu überprüfen, was das Update tun würde. –

2
update t1 
set field1 = case 
    when t1.field1 = 'foo' then 'bar' 
    else 'foobar' 
end 
from table1 t1 
join table2 t2 on t1.obj_id=t2.id 
where t2.field1 = 'fizzbuzz' 
and t2.field2 in ('foo', 'bar', 'foobar'); 
3

Wir können in SQL Server in UPDATE JOIN-Anweisung

update t1 
    set t1.field1 = case 
     when t1.field1 = 'foo' then 'bar' 
     else 'foobar' 
    end 
    from table1 t1 
    inner join table2 on t1.obj_id=table2.id 
    where table2.field1 = 'fizzbuzz' 
    and table2.field2 in ('foo', 'bar') 
Verwandte Themen