首页 > 解决方案 > Mysql 子查询别名与存在和联合所有

问题描述

我有一个这样的查询:

SELECT '__HEADER__' as col1, 'HEADER MESSAGE' as col2 
WHERE EXISTS (SELECT col1, col2,
       FROM table1) long_long_query
UNION ALL 
long_long_query

但似乎不喜欢别名。显然,我只想在结果存在时才使用标题,而不是复制/粘贴长长的查询两次。是否可以?

标签: mysqlexistsunion-all

解决方案


您不能使用别名来引用与 . 一起使用的子查询EXISTS

如果要避免两次编写查询,可以使用 MySQL 8.x 中的 Common Table Expression:

WITH long_long_query AS (
    SELECT col1, col2
    FROM table1
)
SELECT SELECT '__HEADER__' as col1, 'HEADER MESSAGE' as col2 
FROM DUAL
WHERE EXISTS (SELECT * FROM long_long_query)
UNION
SELECT * FROM long_long_query;

在 8.x 之前,您可以定义视图。

CREATE VIEW long_long_query AS
SELECT col1, col2
FROM table1;

SELECT SELECT '__HEADER__' as col1, 'HEADER MESSAGE' as col2 
FROM DUAL
WHERE EXISTS (SELECT * FROM long_long_query)
UNION
SELECT * FROM long_long_query;

推荐阅读