Postgres中避免多个子查询的语法

时间:2011-04-03 01:32:03

标签: postgresql nested subquery

我是postgres的新手,所以请放轻松我。

我正在尝试编写一个查询,以便对于任何用户,我可以将所有日志文件(包括他们的活动和其他人的活动)拉出一分钟,然后在他们的名字出现在日志中的一分钟之后相同的批处理戳。

chat.batchstamp is varchar
chat.datetime is timestamp
chat.msg is text
chat.action is text    (this is the field with the username)

以下是我想要使用的单独命令,我只是不知道如何将它们组合在一起,如果这是真正正确的路径。

SELECT batchstamp, datetime, msg FROM chat WHERE action LIKE 'username';

预期输出:

batchstamp   datetime      msg  
abc          2010-12-13 23:18:00 System logon          
abc          2010-12-13 10:12:13 System logon    
def          2010-12-14 11:12:18 System logon

SELECT * FROM chat WHERE datetime BETWEEN datetimefrompreviousquery - interval '1 minute' AND datetimefrompreviousquery + interval '1 minute';

您能帮我解释一下我应该做些什么来将前一个查询中的数据提供给第二个查询吗?我查看了子查询,但是我需要运行两个子查询吗?我应该建立一个临时表吗?

完成所有操作后,如何确保查询匹配的时间在同一个批处理戳中?

如果你能够指出我正确的方向,那就太好了。如果您能够提供查询,那就更好了。如果我的解释没有意义,也许我一直在考虑这个问题。

感谢您的时间。

根据下面的nate c代码,我使用了这个:

SELECT * FROM chat, 
( SELECT batchstamp, datetime FROM chat WHERE action = 'fakeuser' ) 
AS log WHERE chat.datetime BETWEEN log.datetime - interval '1 minute' AND log.datetime + '1 minute';

它似乎没有返回'fakeuser'的每一个命中,当它发生时,它从每个'batchstamp'而不是仅仅找到'fakeuser'的日志中提取日志。我在进行另一个嵌套查询吗?这种程序叫什么,所以我可以进一步研究它?

再次感谢。

2 个答案:

答案 0 :(得分:1)

您的第一个查询可以使用'('括号围绕'和'作为别名'名称进入from子句。之后,您可以像查询其余部分中的普通表一样引用它。

SELECT
* 
FROM chat,
(
    SELECT
        batchstamp,
        datetime, 
        msg
    FROM log
    WHERE action LIKE 'username'
) AS log

WHERE chat.datetime BETWEEN
    log.datetime - interval '1 minute'
    AND log.datetime + interval '1 minute';

这应该让你开始。

答案 1 :(得分:0)

一位正在工作的同事提出了以下解决方案,似乎提供了我正在寻找的结果。感谢大家的帮助。

SELECT batchstamp, datetime, msg INTO temptable FROM chat WHERE action = 'fakeusername';

select a.batchstamp, a.action, a.datetime, a.msg
FROM chat a, temptable b
WHERE a.batchstamp = b.batchstamp
and (
a.datetime BETWEEN b.datetime - interval '1 minute'
AND b.datetime + interval '1 minute'
) and a.batchstamp = '2011-3-1 21:21:37'
group by a.batchstamp, a.action, a.datetime, a.msg
order by a.datetime;