【问题标题】:PostgreSQL DISTINCT ONPostgreSQL 区别开
【发布时间】:2020-06-11 08:01:32
【问题描述】:

我无法定义别名或选择特定列,只能使用通配符:

工作:

SELECT DISTINCT ON (r.InsertDate) *  
FROM public.server AS s
LEFT JOIN public.Report AS r ON s.Id = r.ServerId
ORDER BY r.InsertDate DESC;

不工作:

SELECT DISTINCT ON (r.InsertDate) LastReport, s.Id, s.Servername 
FROM public.server AS s
LEFT JOIN public.Report AS r ON s.Id = r.ServerId
ORDER BY r.InsertDate DESC;

错误

ERROR:  column "lastreport" does not exist
LINE 1:  SELECT DISTINCT ON (r.InsertDate) LastReport, s.Id, s.Serve...
                                           ^
SQL state: 42703
Character: 36

也不行:

SELECT DISTINCT ON (r.InsertDate) , s.Id, s.Servername 
FROM public.server AS s
LEFT JOIN public.Report AS r ON s.Id = r.ServerId
ORDER BY r.InsertDate DESC;
ERROR:  column "lastreport" does not exist
LINE 1:  SELECT DISTINCT ON (r.InsertDate) LastReport, s.Id, s.Serve...
                                           ^
SQL state: 42703
Character: 36

ERROR:  syntax error at or near ","
LINE 1:  SELECT DISTINCT ON (r.InsertDate) , s.Id, s.Servername 
                                           ^
SQL state: 42601
Character: 36

有什么想法吗?

【问题讨论】:

    标签: sql postgresql distinct-on


    【解决方案1】:

    您似乎对DISTINCT ON 感到困惑。它不会“返回一列”。它是一个句法结构。这些是SELECT 的变体:

    SELECT ALL
    SELECT DISTINCT
    SELECT DISTINCT ON ()
    

    (第一个是默认的,实际中从未使用过。)

    列列表遵循这些结构。所以,显然你想要:

    SELECT DISTINCT ON (r.InsertDate) r.InsertDate as LastReport, s.Id, s.Servername 
    FROM public.server s LEFT JOIN
         public.Report r
         ON s.Id = r.ServerId
    ORDER BY r.InsertDate DESC;
    

    事实证明,DISTINCT ON 实际上是在 SELECT 子句的其余部分之后解析的,因此您可以使用列别名:

    SELECT DISTINCT ON (LastReport) r.InsertDate as LastReport, s.Id, s.Servername 
    FROM public.server s LEFT JOIN
         public.Report r
         ON s.Id = r.ServerId
    ORDER BY LastReport DESC;
    

    但是,别名必须在distinct on之后的列列表中定义。

    请注意,您使用的是LEFT JOIN,所以r.InsertDate 可以NULLL

    【讨论】:

    • 谢谢你,我今天的英雄 :)
    猜你喜欢
    • 2010-09-18
    • 2020-07-29
    • 1970-01-01
    • 2016-12-11
    • 2016-04-17
    • 2018-11-27
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多