首页 > 解决方案 > Union 在 SQL 查询中的行为方式(就优先级而言)

问题描述

我们知道在 SQL 中代码执行的顺序是:

  1. FROM
  2. WHERE
  3. GROUP
  4. SELECT

现在,我可以在 SQL 中编写(Example1):

SELECT colA, colB
FROM tableA
UNION
SELECT colA, colB
FROM tableB
WHERE colA > 1

我也可以写(Example2):

SELECT * 
FROM (
  SELECT colA, colB
  FROM tableA
  UNION
  SELECT colX, colA
  FROM tableB
)
WHERE colA > 1

我的问题是关于Example1 条件WHERE是 ontableB还是 on theUNION和?与非常清楚的Example2不同,在Example1中它不是 (?)。tableAtableB

我在任何数据库中都没有找到任何解释这个关于UNION.

标签: sql

解决方案


第一条语句中所写的WHERE子句属于 UNION 的第二部分。您可以通过在两个表中使用不同的列名来测试它:

create table t1 (c1 int, c2 int);
create table t2 (c3 int, c4 int);

然后是以下查询:

select c1, c2 
from t1
union all
select c3, c4
from t2
where c1 > 1

将导致错误声明该列c1不存在(或不能在该上下文中使用 - 取决于 DBMS 产品)。

相同的规则适用于 a GROUP BYor HAVING,但不适用于 a possible ORDER BY- 它总是对联合的结果进行排序。

Postgres 示例

甲骨文示例

SQL Server 示例


推荐阅读