使用子查询的PostgreSQL查询给出了异常

时间:2013-07-01 05:26:14

标签: postgresql select max

这是我的postgres查询(使用postgres 9.0版本),用于选择每个网址的最新记录。我的dns_lookup_table包含不同时间的每个网址的不同值。

url1,url2,url3是'text'类型,update_time是'timestamp with timezone',dns_time是'numeric'类型。

select url,
       dns_time,
       update_Time 
from dns_lookup_table 
where url in('url1', 'url2','url3') 
 and  update_time = max(select to_char(update_time,'YYYY-MM-DD HH24:MI'));

请帮助我,我在“选择”

时遇到语法错误

1 个答案:

答案 0 :(得分:1)

您正在使用不正确的子查询语法:

select url,dns_time,update_Time
from dns_lookup_table
where url in('url1', 'url2','url3')
  and update_time=max(select to_char(update_time,'YYYY-MM-DD HH24:MI'));
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

您忘了将子查询括在括号中:

  and update_time=max((select to_char(update_time,'YYYY-MM-DD HH24:MI')));
                      ^                                                ^
                      |-------------- extra parens --------------------|

但是在这种情况下你根本不需要子查询,你可以通过简单的嵌套来调用函数:

  and update_time=max(to_char(update_time,'YYYY-MM-DD HH24:MI'));
但是,这仍然是胡说八道。您正在将update_timeupdate_timetext的文本转换进行比较。哪个没有意义。为什么你甚至试图将update_time与自己进行比较呢?也许你打算做一个子查询FROM另一张表?如果是这样,你通常最好不要做一个简单的连接。

您的进一步评论表明您确实需要date_trunc。如果我猜错了你想要做的事情:

选择update_time相同的所有行,忽略秒数,作为表格中最新的update_time

...然后你可以写:

SELECT url,dns_time,update_Time
FROM dns_lookup_table 
WHERE url IN ('url1','url2','url3')
  and date_trunc('minute',update_time) = (
    SELECT date_trunc('minute', max(update_time))
    FROM dns_lookup_table 
    WHERE url IN ('url1','url2','url3')
  );

虽然这不会使用您在update_time上为过滤器定义的任何索引。您需要在date_trunc('minute', update_time)上创建索引,或者重新定义查询以使用BETWEEN和从INTERVAL创建的范围。