我有以下查询:
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作为名字吗?
答案 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)。
顺便说一句。我尚未测试或编译该函数,因此可能会出现语法错误。此外,我使用原始查询,但同意您应该更新为现代语法。