擅长:python、mysql、java
<p>您可以将其重写为子查询:</p>
<pre><code>select val1, val2, val3, val4
from (
SELECT val1, val2, val3, val=2 as val4 FROM table2
UNION
SELECT val1, val2, val3, val=3 as val4 FROM table3
) t
where some_condition
</code></pre>
<p>但是要小心,因为这不一定是最好的选择。在</p>
<p>这可能是令人满意的,因为您避免重写条件,但是对于查询规划器来说,这两个查询可能是非常不同的动物。Postgres偶尔会聪明到可以将where条件注入到子语句中,但我从未见过这样做的一个例子是当子语句具有任何类型的聚合时。在</p>
<p>具体地说,如果条件放在外部(如上所述),您将首先附加两个完整的表。然后聚合它们以消除重复项(这是一个避免使用<code>union all</code>而不是<code>union</code>,顺便说一句)的步骤,最后过滤结果集中与您的条件匹配的行。在</p>
<p>相比之下,当放在单个位中时,您将追加并排序两个较小的行集。它会更快,消耗更少的内存。在</p>
<p>简而言之,在查询中尽可能早地过滤行。在</p>