如何在联合查询的另一个选择中使用选择的结果?
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 by
和rollup
时,为什么要这样做?看来你想要这样的东西:
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
【讨论】:
以上是关于如何在联合查询的另一个选择中使用选择的结果?的主要内容,如果未能解决你的问题,请参考以下文章