Die Antwort, warum Ihre Abfrage fehlschlägt wurde bereits in einer anderen Antwort gegeben. Hier ist ein anderer Ansatz.
Sie möchten wissen, ob in einer der Tabellen ein Wert existiert. Aber anstatt EXISTS
(oder IN
für diese Angelegenheit) zu verwenden, wählen Sie aus allen Tabellen, kleben Sie ihre Ergebnisse und eliminieren Duplikate. Hier ist eine Möglichkeit, 12 zu wählen, wenn in eines der Tabellen gefunden (und der Optimierer kann einen Algorithmus zur Anwendung, wenn es liest nur bis zum ersten Spiel gefunden):
select numerocert
from (select 12 as numerocert) t
where numerocert in (select numerocert from certificati)
or numerocert in (select numeroarbo from cert_arbo)
or numerocert in (select numeroerba from cert_erba)
;
Im Allgemeinen (für alle RDBMS) nicht es ist sicherer, die erste Lösung zu verwenden? Da dies vom System keine Verbesserung benötigt. Die zweite Lösung könnte viele Zeilen zurückgeben, und mit einer 'UNION' wurde eine Menge überprüft. Also könnte dies viel Speicher und Verarbeitung kosten. – AxelH
@AxelH: Ja, das stimmt. Mit der zweiten Abfrage würden wir uns darauf verlassen, dass der Optimierer dies durchschaut und einen besseren Ausführungsplan aufstellt. Es ist jedoch eine Möglichkeit, die 12 nur einmal eingeben zu müssen (wenn wir dies einmal zu 13 ändern möchten, müssen wir sie nur an einer Stelle ändern, d. H. Die Abfrage ist weniger fehleranfällig). –