Mysql 子查询别名与存在和联合所有

Posted

技术标签:

【中文标题】Mysql 子查询别名与存在和联合所有【英文标题】:Mysql subquery alias with exists and union all 【发布时间】:2020-06-22 16:51:53 【问题描述】:

我有一个这样的查询:

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

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

【问题讨论】:

EXISTSIN 一起使用的子查询不需要别名 我需要它,因为它是结果,它在标题之后并且在 union all 关键字下 【参考方案1】:

您不能使用别名来引用与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;

【讨论】:

是的,with 子句正是我想要的,我想了想,并在数据库检查器上尝试了 AS 4.1(预览版),但没有奏效。尝试了WITH npr AS (SELECT 'whatever') SELECT * FROM npr 之类的东西,但没有结果。但在应用程序中,复杂的查询有效。为 android studio 打开了 bug。谢谢。 您可能需要告诉 AS 您使用的是什么版本的 MySQL,以便它识别 8.0 中添加的功能。 我认为他们已经意识到了这个问题,基于我提出的错误的 cmets issuetracker.google.com/issues/159575631 无论如何感谢您的回答,很高兴确保 with 子句是一个可行的解决方案。

以上是关于Mysql 子查询别名与存在和联合所有的主要内容,如果未能解决你的问题,请参考以下文章

mysql学习之路_联合查询与子查询

MySQL 子查询与多表联合查询

连接查询与子查询

联合分组子查询视图事务python操作mysql索引

MySQL 别名子查询

MySQL的查询,子查询,联结查询,联合查询