2017-04-04 7 views
1

ich dies gemacht habe überprüfen:auswählen und einen Wert von 3 Tabellen

(SELECT numerocert FROM certificati) 
UNION 
(SELECT numeroarbo AS numerocert FROM cert_arbo) 
UNION 
(SELECT numeroerba AS numerocert FROM cert_erba) 
WHERE numerocert = 12 

ich, wenn die Zahl 12 sehen will, die in diesen drei Tabellen, aber nicht verstehen, was falsch ist.

Antwort

2

Die where Statement muss drei Tabellen nennen verbunden werden:

SELECT numerocert FROM certificati WHERE numerocert = 12 
UNION 
SELECT numeroarbo AS numerocert FROM cert_arbo WHERE numeroarbo = 12 
UNION 
SELECT numeroerba AS numerocert FROM cert_erba WHERE numeroerba = 12 

oder Sie sie eine äußere Abfrage verwenden:

select numerocert from (
    (SELECT numerocert FROM certificati) 
    UNION 
    (SELECT numeroarbo AS numerocert FROM cert_arbo) 
    UNION 
    (SELECT numeroerba AS numerocert FROM cert_erba) 
) 
WHERE numerocert = 12 
+0

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

+0

@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). –

0
Select * 
    From 

    (SELECT numerocert FROM certificati 

UNION 

    SELECT numeroarbo AS numerocert FROM cert_arbo 

    UNION 

    SELECT numeroerba AS numerocert FROM cert_erba) tab 
    WHERE numerocert = 12 

Sie müssen wickeln Sie das Ergebnis der Gewerkschaften in eine Tabelle dann gelten Abfrage auf diese

1

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) 
; 
+0

Ich mag diese Notation, da dies die Kosten der Abfrage reduziert (zumindest glaube ich, wird es nicht wissen, th Kosten eines 'in') und begrenzt den Parameter (12) auf einen Platz. – AxelH

Verwandte Themen