So etwas wie dies funktioniert.
HINWEIS: Sie haben gesagt, dass Sie diese drei Abfragen zum Aktualisieren verwenden ... Das stimmt nicht. Ihre Abfragen würden nicht wie geschrieben funktionieren; NUMBER ist ein reserviertes Oracle-Schlüsselwort, sodass Sie Kompilierungsfehler erhalten. Wenn du etwas postest, sei bitte sehr vorsichtig, was du sagst. Die Abfrage, die ich unten als Lösung anbiete, wird aus dem gleichen Grund auch nicht funktionieren. Verwenden Sie Ihre tatsächlichen Spaltennamen.
UPDATE NUMBER_TABLE n SET STATUS='X' WHERE STATUS='P' AND EXISTS
(SELECT 1 FROM TMP_NUMBER_FOUND t where n.NUMBER = NVL(t.CONTACT_NO, 'XXXXXXXXXX')
or n.NUMBER = NVL(t.HOME_NO , 'XXXXXXXXXX')
or n.NUMBER = NVL(t.WORK_NO , 'XXXXXXXXXX')
)
;
Added basierend auf weitere Informationen von OP (siehe Kommentar).
Das OP teilte die Information, dass in seinen Daten keine Zahlen gleich 'XXXXXXXXXX'
sind. In diesem Fall ist die NVL(...)
unnötig und verschwendet nur Zeit. Vergleichen mit 'XXXXXXXXXX'
in diesem Fall wird der gleiche sein wie im Vergleich zu NULL
, da im Vergleich zu NULL
nie TRUE
zurückgibt. Also: entfernen diejenigen NVL
Wrapper, sie sind eine große Quelle der Langsamkeit.
mit einem anderen Dies wird kommen, noch mehr Nutzen: die Spalten CONTACT_NO
, HOME_NO
und WORK_NO
sollten, wenn sie es nicht schon sind indiziert werden, und wenn sie von NVL(...)
nicht umgeben sind, können die Indizes tatsächlich verwendet werden. Es sollte auch einen Index für NUMBER
geben. Das OP sagte, dass diese Spalte Teil der PK ist, aber nicht die erste Spalte in der PK, und fragte, ob er es zur ersten Spalte machen sollte. Die Antwort ist JA - oder, wenn es einen guten Grund gibt, dass eine andere Spalte zuerst bleiben sollte (vielleicht verlassen sich andere Abfragen darauf), dann sollte NUMBER
seinen eigenen Index bekommen. Aber wenn es die erste Spalte in der PK gemacht werden kann, sollte das ausreichen.
Gibt es tatsächlich Zeilen in 'NUMBER_TABLE' wo' NUMBER' ist ' 'XXXXXXXXXX''? –