WHERE-Anweisung nach einer UNION in SQL?

71

Wie wende ich eine WHERE-Anweisung nach einer UNION in SQL / MySQL an?

einstein
quelle

Antworten:

125

Wenn Sie die WHERE-Klausel auf das Ergebnis der UNION anwenden möchten, müssen Sie die UNION in die FROM-Klausel einbetten:

SELECT *
  FROM (SELECT * FROM TableA
        UNION
        SELECT * FROM TableB
       ) AS U
 WHERE U.Col1 = ...

Ich gehe davon aus, dass TableA und TableB gewerkschaftskompatibel sind. Natürlich können Sie auch eine WHERE-Klausel auf jede einzelne SELECT-Anweisung in der UNION anwenden.

Jonathan Leffler
quelle
3
Irgendeine Idee, ob MySQL das Prädikat in die einzelnen Anweisungen pusht?
Martin Smith
2
@ Martin: es könnte - es könnte nicht. Sie müssten sich den Abfrageplan ansehen. Dies hängt auch von den Bedingungen der WHERE-Klausel ab.
Jonathan Leffler
2
@ Martin, hoffe nicht zu viel. Wenn wir so etwas machen, zeigt sich, wie dumm MySQL ist ...
Pacerier
16

Sie müssen das wahrscheinlich UNIONin ein Unterzeichen einschließen SELECTund anschließend die WHEREKlausel anwenden :

SELECT * FROM (
    SELECT * FROM Table1 WHERE Field1 = Value1
    UNION
    SELECT * FROM Table2 WHERE Field1 = Value2
) AS t WHERE Field2 = Value3

Grundsätzlich UNIONsucht das nach zwei vollständigen SELECTAnweisungen zum Kombinieren, und die WHEREKlausel ist Teil der SELECTAnweisung.

Es kann sinnvoller sein, die äußere WHEREKlausel auf beide inneren Abfragen anzuwenden . Sie möchten wahrscheinlich die Leistung beider Ansätze bewerten und herausfinden, welche für Sie besser funktioniert.

David
quelle
0
select column1..... from table1
where column1=''
union
select column1..... from table2
where column1= ''
pinkykitty
quelle