2010-07-01 7 views
7

Ich versuche, so etwas zu tun:Mit einem einzigen gemeinsamen WHERE-Bedingung für UNION in SQL

SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id 
UNION 
SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id 
WHERE a.date>'2010-01-01' 
ORDER BY EnrollDate 

Aber die WHERE-Bedingung nur für die zweite SELECT-Anweisung gilt. Ich muss mich irgendwie auf den SELECT anwenden. Die einzige Option, die ich jetzt habe, ist, die WHERE-Bedingung einzeln anzuwenden. Aber ich arbeite mit mehreren UNIONs zusammen und es ist etwas mühsam, überall WHERE einzubeziehen. Ich frage mich, ob es einen einfachen Ausweg gibt.

Übrigens arbeite ich mit MySQL.

+0

akzeptieren Sie die ans, wenn es für Sie funktioniert –

Antwort

11
SELECT * FROM (
    SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id 
    UNION 
    SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id 
) A 
WHERE EnrollDate > '2010-01-01' 
ORDER BY EnrollDate 

Dies hat auch den Vorteil, im Vergleich zu einzelnen ORDER BY ist, dass das gesamte Ergebnis richtig bestellt wird.

+0

Nun, die gleiche Antwort: P gute Arbeit Kumpel –

+0

Danke Kumpel. Sie haben mein Problem gelöst :) – jitendra

+0

Übrigens sollte die WHERE-Klausel EnrollDate anstelle von d.date zum Vergleich verwenden;) – jitendra

-1

Es gibt keine andere Möglichkeit, Sie müssen das WHERE für jede einzelne SELECT-Klausel wiederholen.

+2

Ok, mit Blick auf die anderen Antworten, ist meine Antwort falsch, wie es heißt, es gibt keine Möglichkeit, um es herum. Allerdings würde ich unter Performance-Gesichtspunkten davon ausgehen, dass alle Lösungen der ersten UNIONing und dann die Bewertung der WHERE-Bedingung wahrscheinlich schlimmer sein werden (wenn Sie keinen wirklich cleveren Optimierer haben, den ich für MySql nicht annehmen würde). – Frank

+0

Das Anwenden der WHERE auf jeden Teil einzeln ist nur dann besser, wenn ein Index verfügbar ist. Beachten Sie auch, dass UNION langsamer als UNION ALL ist, da es den zusätzlichen Schritt zum Entfernen von Duplikaten enthält. – Brilliand

4

Haben Sie versucht, so etwas wie:

SELECT * FROM 
(
    SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id 
    UNION 
    SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id 
) A 
    WHERE a.date>'2010-01-01' 
    ORDER BY EnrollDate 
+0

Sie müssen entweder der Unterabfrage einen Alias ​​geben oder die 'a.date' einfach mit 'date' ersetzen. –

+0

Ja, ich habe es vergessen. repariert es in der Bearbeitung –