如何在联合查询的另一个选择中使用选择的结果?

Posted

技术标签:

【中文标题】如何在联合查询的另一个选择中使用选择的结果?【英文标题】:How to use the results of a select in another select in a union query? 【发布时间】:2015-12-22 06:56:42 【问题描述】:

我有一个联合查询,我想在联合查询“右侧”的选择语句中使用联合查询“左侧”中的选择结果。下面的查询正常工作(至少在 postgres 上),但我运行 query1 2 次,一次作为 query1,再次作为 sameAsQuery1。

select x as zz from (select 69 as x) as query1
union all
select count(zz) as zz from 
      (select x as zz from (select 69 as x) as sameAsQuery1) as query2

我想做这样的事情,所以我不必运行 query1 2 次,但它不起作用:

select x as zz from (select 69 as x) as query1
union all
select count(zz) as zz from query1

我收到此错误消息:

错误:关系“query1”不存在第 3 行:选择计数(zz) 作为来自query1的zz

有没有办法重写这个查询,让 query1 只运行一次?

对 Llama 先生的回复稍作修改,效果很好,看起来像这样(注意添加了“as q2”):

WITH
query1 AS
(
    SELECT x AS zz FROM (SELECT 69 AS x) as q2
)
SELECT zz FROM query1
UNION ALL
SELECT COUNT(zz) AS zz FROM query1

【问题讨论】:

请展示一些示例数据和预期结果 请用您正在使用的数据库标记您的问题? 数据包含在查询本身中。 @Mr. Llama 的回应稍作修改,效果很好。 select x as zz from (select 69 as x) as query1 可以替换为简单的select 69 或只是values (69) 【参考方案1】:

您正在寻找common table expressions。

它们允许您定义结果并在查询中多次使用它。

在你的第一个案例中:

WITH
query1 AS
(
    SELECT x AS zz FROM (SELECT 69 AS x)
)
SELECT zz FROM query1
UNION ALL
SELECT COUNT(zz) AS zz FROM query1

【讨论】:

【参考方案2】:

将query1结果放入临时表

select x as zz from (select 69 as x) as query1 into temptable

现在在第二个查询中使用临时表

select zz from temptable
union all
select count(zz) as zz from temptable 

【讨论】:

不鼓励使用非标准的select .. into ..。最好使用标准的create table .. as select .. 语法(加上临时表不是必需的)【参考方案3】:

当大多数数据库都支持group byrollup 时,为什么要这样做?看来你想要这样的东西:

select x, count(*) as cnt
from <whatever>
group by x with rollup;

【讨论】:

Postgres 不(还)支持汇总(我认为它将在即将到来的 9.5 中) @a_horse_with_no_name 。 . .在我的辩护中,当我回答这个问题时,它没有被标记为 Postgres。 (Oracle、mysql、SQL Server、Teradata 和 DB2 ——可能还有其他人——确实支持它或类似的东西。)【参考方案4】:

您可能需要一个公用表表达式来重用 SELECT:

with cte as
( select x as zz from (select 69 as x) as query1 )
select * from cte
union all
select count(zz) as zz from cte

【讨论】:

以上是关于如何在联合查询的另一个选择中使用选择的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何将表连接到联合查询的结果

在 Laravel Eloquent 中,你如何在联合范围之外进行两个联合查询和一个选择?

MySQL数据库联合查询与连接查询

MySQL增删改查之多表联合查询

如何联合2选择而不重复

选择使用联合查询