2016-03-31 16 views
0

Ich versuche, alle Zeilen in meinem Fall Tabelle zu aktualisieren:Aktualisieren Sie alle vorhandenen Zeile

UPDATE CASE c 
SET c.number = 
(
select p.number 
from CASE c, Papers p, Dokument d 
where c.dokument = d.id 
and p.id = d.paperid 
and p.numer is not null 
and c.case = null; 
) 
where 
(this same as in set : when case.number is null but papers.numer is not null) 

Ich kann das nicht tun, weil ich weiß nicht, wie, wo Klauseln zu schreiben. Es muss alle Zeilen aktualisieren, in denen case.numer null ist und papers.number nicht null ist.

Wie kann ich das schreiben? Könnte ich eine Schleife schreiben? Ich habe PL/SQL noch nie benutzt, also weiß ich auch nicht, wie ich das machen soll.

Ich habe auch so zu aktualisieren versucht, aber einen Fehler bekam:

UPDATE s 
SET s.number = w.number 
FROM CASE s 
JOIN Dokument d on d.CASEID =s.ID 
JOIN Paper w on w.DOKUMENTID =d.ID and w.number is NOT NULL 
WHERE s.number IS NULL 
AND s.secondNumber IS NULL 
AND s.FIRSTNAME = w.FIRSTNAME 
AND s.SURNAME = w.SURNAME; 

SQL Error: ORA-00933: polecenie SQL niepoprawnie zakończone 
00933. 00000 - "SQL command not properly ended" 
+4

tsql oder Oracle? Ich kann dich nicht sehen, wenn du sie zusammen benutzt. – jarlh

+0

Basierend auf dem Kommentar im letzten Satz, entfernte ich das Oracle-Tag. –

+0

Bitte geben Sie an, welches DBMS Sie verwenden. Sie haben jetzt das PL/SQL-Tag hinzugefügt, das für Oracle und nicht für SQL Server geeignet wäre. Diese Dinge sind wichtig. –

Antwort

3

Dies ist die Art und Weise, wie ich es in T-SQL tun würde ....

update c 
set c.number = p.number 
from [CASE] c 
join [Dokument] d on c.dokument = d.id 
join [Papers] p on p.id = d.paperid and p.number is not null 
where c.number is null 

Aber Da ich Ihre Tabellenstruktur nicht sehen kann, habe ich aus irgendeinem Grund vermutet, dass Ihr Tabellenname [Case] ​​ist. Wenn ich es richtig vermute ...

Probieren Sie es aus und lassen Sie mich wissen, ob es funktioniert

+0

Danke, können Sie sagen, ob es alle Zeilen aktualisiert, oder nur die erste Zeile, die diese Bedingungen erfüllt? – jan345

+0

Es aktualisiert alle Zeile, die die WHERE-Bedingung erfüllen ... in diesem Fall alle Zeilen, die Nummer Null in [Case] ​​-Tabelle ... aber testen Sie es – Veljko89

+0

Vielen Dank Ich bin aus meinem Arbeitscomputer, aber morgen erzähle ich Sie, wenn es alles funktioniert – jan345

0

Ihre zweite Anweisung, die in einer Bearbeitung hinzugefügt wurde, ist für Oracle nicht gültig, da Sie nicht an einer Update- (oder Lösch-) Anweisung teilnehmen können. Sie benötigen also eine Unterabfrage, wie Sie es in Ihrer ersten Anweisung versucht haben.

Aber in diesem Unterabfrageversuch korrelieren Sie nicht richtig; Der Verweis auf die CASE-Tabelle in der Unterabfrage sollte nicht vorhanden sein, da Sie sich auf den Alias ​​aus der update-Klausel beziehen können. Und Sie können dann tun die gleiche Abfrage in einer exists Klausel zu entscheiden, was zu aktualisieren:

update case c 
set c.number = 
(
select p.number 
from papers p 
join dokument d 
on d.paperid = p.id 
where c.dokument = d.id 
and p.number is not null 
) 
where c.number is null 
and exists (
select p.number 
from papers p 
join dokument d 
on d.paperid = p.id 
where c.dokument = d.id 
and p.number is not null 
); 

Dies setzt voraus, es wird nur sein (höchstens) ein passender p.number, was nicht der Fall sein kann. Wenn es mehr als einen geben kann, dann müssen Sie auswählen, welche verwendet werden soll - mit max/min, einigen Bestellkriterien, etc. Die Verwendung eines Aggregats würde die p.number is not null Prüfung ein wenig überflüssig machen.

('Nummer' ist kein gültiger Spaltenname; Sie haben 'Nummer' und 'Zahl' in der Frage verwendet; ersetzen Sie Ihren tatsächlichen Spaltennamen. 'Fall' ist auch kein guter Name für eine Tabelle wie das ist ein Funktionsname).

Verwandte Themen