Was ist Los mit meinem update-Anweisung mit einem join in Oracle?
Arbeite ich mit einem Oracle 10g Datenbank.
Habe ich die beiden folgenden Tabellen:
T_DEBTOR :
- ID_DEBTOR
- HEADER
T_ELEMENT :
- ID_ELEMENT
- ID_DEBTOR
- INSURER
Diese beiden Tabellen verbunden sind, verwenden Sie die ID_DEBTOR Feld.
Ich soll ein update der T_ELEMENT.VERSICHERER-Wert mit der zugehörigen T_DEBTOR.HEADER, nur wenn HEADER ist nicht null.
In anderen Worten:
If T_DEBTOR.HEADER != null
Then T_ELEMENT.INSURER = T_DEBTOR.HEADER
Else T_ELEMENT.INSURER is not modified!
Ich versucht, verwenden Sie die folgende SQL-Abfrage:
update
T_ELEMENT elt
set elt.INSURER = (
select HEADER
from T_DEBTOR debtor
where
debtor.HEADER is not null
and debtor.ID_DEBTOR = elt.ID_DEBTOR);
Diese Abfrage funktioniert für alle Elemente in Verbindung mit Schuldnern, die eine KOPFZEILE, die nicht null sind.
Allerdings, wenn die T_DEBTOR.HEADER null ist, dann ist diese Abfrage der T_ELEMENT.VERSICHERER auf null, was nicht richtig ist.
ie:
If T_DEBTOR.HEADER != null
Then T_ELEMENT.INSURER = T_DEBTOR.HEADER --> This part is OK
Else T_ELEMENT.INSURER is set to null --> This part is NOT OK
Was ist falsch mit meiner Abfrage?
Bearbeiten, über die Brian Storrar Antwort:
Was ich tun möchte ist etwas wie das:
update
T_ELEMENT elt
set elt.INSURER = (
select HEADER
from T_DEBTOR debtor
where
debtor.HEADER is not null
and debtor.ID_DEBTOR = elt.ID_DEBTOR)
where debtor.HEADER is not null;
InformationsquelleAutor Romain Linsolas | 2009-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gute Frage.
Simulieren Ihre situation, die ich angelegt habe Beispieltabellen:
Und mit Ihrer aktuellen update-Anweisung, die das problem deutlich: "nicht aktualisiert" - Werte werden auf NULL gesetzt:
Der beste Weg, dies zu tun, update, aktualisieren, einen join der beiden Tabellen. Es gibt einige Einschränkungen, aber:
Bypass-ujvc Hinweis, wir können diese Einschränkung umgehen.
Aber es ist nicht ratsam, dies zu tun, es sei denn, Sie wissen wirklich, wirklich sicher, dass t_debtor.id_debtor ist einzigartig.
Es ist besser, nur fügen Sie einen Primärschlüssel hinzu. Sie werden wahrscheinlich haben diese bereits umgesetzt:
Grüße,
Rob.
InformationsquelleAutor Rob van Wijk
Ich eine Lösung gefunden habe um mein problem zu lösen (die where-Klausel Hinzugefügt wird):
Wenn Sie eine bessere Lösung haben, zögern Sie nicht, um es zu veröffentlichen!
InformationsquelleAutor Romain Linsolas
seit Oracle 8i (ich habe nicht versucht, mit den vorhergehenden Versionen), können Sie aktualisieren Sie eine Verknüpfung, wenn die Tabellen der "key-preserved" (i-e: wenn Sie ein Update das Kind in einer Eltern-Kind-Beziehung). Hier, wenn id_debtor ist der Primärschlüssel der T_DEBTOR, können Sie :
Cheers,
--
Vincent
InformationsquelleAutor Vincent Malgrat
Haben Sie versucht,
oder etwas ähnliches
admittedy das ist ein bisschen eine unselektive, aber ich denke, es wird tun, was Sie wollen.
Da diese aktualisiert wird jede Zeile in der Tabelle, obwohl, es wird potentiell wesentlich mehr WIEDERHOLEN als die anderen Optionen. Und wenn Sie auditing, history-tracking, oder Trigger auf dieser Tabelle, Sie könnte die Schaffung Probleme für sich selbst.
InformationsquelleAutor stjohnroe
Können Sie dies tun, aktualisieren Sie die Ergebnisse einer select -, aber die Tabellen müssen 'Taste erhalten':
Schafft, dass Ihre Tabellen (Tipp - es ist sehr nützlich, wenn Sie post-SQL für dein Beispiel!).
Jetzt aktualisieren können Sie die Ergebnisse einer select-das zu geben, was Sie wollen ...
Dies schlägt fehl, da die Tabelle keine Schlüssel erhalten, aber ein paar Einschränkungen zu lösen:
Nun das update funktionieren wird, weil die Tabellen-Schlüssel erhalten:
InformationsquelleAutor Stephen ODonnell
Haben Sie versucht,
InformationsquelleAutor Hooloovoo
Könnten Sie die SQL-Case-Anweisung zu unterscheiden, wenn die HEADER null ist, und wenn es einen Wert hat:
http://www.tizag.com/sqlTutorial/sqlcase.php
InformationsquelleAutor John Smithers
@Rob Danke für den /*+ bypass_ujvc */Tipp. Ich habe ein paar Fälle, wo ich zu verwenden. Ich wünschte, mein DBA erzählt werden können. Es gibt ein paar mal hatte ich einen cursor zu erstellen, dies zu umgehen.
InformationsquelleAutor H20rider