SQL中的UNION之后的WHERE语句?


71

在SQL / MySQL中,如何在UNION之后应用WHERE语句?

Answers:


125

如果要将WHERE子句应用于UNION的结果,则必须将UNION嵌入到FROM子句中:

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

我假设TableA和TableB是联合兼容的。当然,您也可以将WHERE子句应用于UNION中的每个单独的SELECT语句。


3
知道MySQL是否会将谓词推送到各个语句中吗?
马丁·史密斯

2
@马丁:可能-可能不会。您必须查看查询计划。它还取决于WHERE子句条件。
乔纳森·勒夫勒

2
@马丁,不要希望太大。有我们这样做节目是多么愚蠢的MySQL是....
Pacerier

16

您可能需要将其包装UNION在一个子目录中,SELECT然后再应用该WHERE子句:

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

基本上,UNION正在寻找两个完整的SELECT语句进行组合,并且该WHERE子句是该SELECT语句的一部分。

将外部WHERE子句应用于两个内部查询可能更有意义。您可能需要对这两种方法的性能进行基准测试,然后看看哪种方法更适合您。


0
select column1..... from table1
where column1=''
union
select column1..... from table2
where column1= ''
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.