如何在postgres中给选择查询一个名字

时间:2019-07-03 14:58:22

标签: postgresql

我有以下查询:

select distinct encoder.encoder enc, src_ip, encoder.datacenter 
from logical_service, unnest(tags) enc, encoder, mpeg_out 
where enc like 'encoder:%' 
  and substring(enc,9) = encoder.encoder 
  and logical_service.lid=mpeg_out.lid 
  and encoder.datacenter=mpeg_out.datacenter 
order by encoder.encoder

我想给这个查询起一个名字,以便以后使用。我试图这样做,但是最终失败了:

with encoder_alias as (
  select distinct encoder.encoder enc, src_ip, encoder.datacenter 
  from logical_service, unnest(tags) enc, encoder, mpeg_out 
  where enc like 'encoder:%' 
    and substring(enc,9) = encoder.encoder 
    and logical_service.lid=mpeg_out.lid 
    and encoder.datacenter=mpeg_out.datacenter 
    order by encoder.encoder
)

它没有给出任何关于为什么不起作用的输出。知道为什么我不能使用with作为名字吗?

2 个答案:

答案 0 :(得分:1)

common table expression之后需要一个最终的SELECT语句:

with encoder_alias as (
  select distinct encoder.encoder enc, src_ip, encoder.datacenter 
  from logical_service
     cross join unnest(tags) enc
     join encoder on substring(enc,9) = encoder.encoder 
     join mpeg_out on logical_service.lid = mpeg_out.lid 
                  and encoder.datacenter = mpeg_out.datacenter 
  where enc like 'encoder:%' 
  order by encoder.encoder
)
select *             ---<<< here
from encoder_alias;

(请注意,我用“现代”(已有30年历史)显式JOIN运算符替换了您古老,过时且脆弱的隐式连接)

答案 1 :(得分:0)

我不认为OP在问如何使CTE发挥作用,而是对CTE的功能产生了误解。它不提供查询的名称。我能描述的最好的地方是它定义了一个“视图”(仅在完整语句的持续时间内存在),供后续查询中使用。
但是对于“给该查询起一个名字以便以后使用它”,我认为要求的实际上是一个函数。 (现在我可以完全不在这里了!如果是这样,那就这样吧)。实际上,以下内容将“命名”查询以供以后使用:

create or replace function encoder_alias()
  returns table ( enc TEXT, src_ip TEXT,  mpeg_out TEXT)
  language sql 
as $$
    select distinct encoder.encoder enc, src_ip, encoder.datacenter 
      from logical_service, unnest(tags) enc, encoder, mpeg_out 
     where enc like 'encoder:%' 
       and substring(enc,9) = encoder.encoder 
       and logical_service.lid=mpeg_out.lid 
       and encoder.datacenter=mpeg_out.datacenter 
     order by encoder.encoder
$$;

如果这是您要查找的内容,则必须使实际的列类型柔软(未发布,因此我只使用了TEXT)。
顺便说一句。我尚未测试或编译该函数,因此可能会出现语法错误。此外,我使用原始查询,但同意您应该更新为现代语法。