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
但似乎不喜欢别名。显然,我只想在结果存在时才使用标题,而不是复制/粘贴长长的查询两次。有可能吗?
【问题讨论】:
与EXISTS
或IN
一起使用的子查询不需要别名
我需要它,因为它是结果,它在标题之后并且在 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 子查询别名与存在和联合所有的主要内容,如果未能解决你的问题,请参考以下文章