在PostgreSQL中的2个不同表上连接2个选择查询

时间:2013-05-20 16:18:09

标签: sql postgresql

我在两个不同的表上有两个单独的查询,我试图加入一个查询。两个表都在同一模式中。

我正在尝试形成一个查询,它将在论坛中返回最新帖子的forumid,threadid和主题。我可以使用下面写的两个查询,但为了提高效率,我宁愿在可能的情况下只使用一个。

以下是我的疑问:

1>
SELECT forumid,threadid
FROM threadtable
WHERE modifieddate = (select max(modifieddate) from threadtable);

2>
SELECT subject
FROM messsagetable
WHERE modifieddate = (select max(modifieddate) from messsagetable);

我尝试了一些解决方案,但似乎是围成一圈。任何建议赞赏。版本是Postgres 8.1。

2 个答案:

答案 0 :(得分:10)

SELECT * FROM 
   (SELECT forumid,threadid
    FROM threadtable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM threadtable)) a, 
   (SELECT subject
    FROM messsagetable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM messsagetable)) b

将第一个结果与第二个

的所有结果结合起来
SELECT * FROM 
   (SELECT forumid,threadid, modifieddate
    FROM threadtable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM threadtable)) a
INNER JOIN 
   (SELECT subject, modifieddate
    FROM messsagetable
    WHERE modifieddate = (SELECT MAX(modifieddate) FROM messsagetable)) b
ON a.modifieddate = b.modifieddate

将第一个结果与第二个具有相同修订日期的结果结合起来。

由于两个查询只返回一个结果,你很可能想要第一个建议。

答案 1 :(得分:8)

要无条件地合并结果,请使用CROSS JOIN

SELECT *
FROM  (
    SELECT forumid, threadid
    FROM   threadtable
    ORDER  BY modifieddate DESC
    LIMIT  1
    ) t
CROSS JOIN (
    SELECT subject
    FROM   messsagetable
    ORDER  BY modifieddate DESC
    LIMIT  1
    ) m

我使用更快更简单的ORDER BY / LIMIT 1修改了基本查询。如果任一表格中有多行共享最大modifieddate,则会选择任意一行 您可以在ORDER BY子句中添加更多项目以在这种情况下选择某一行。

评论后更新

  

然而,修改日期字段在两个表中,在情况下   我试图检索它的条目将是相同的。

这是一个破碎的设计。您需要当前版本的Postgres,您需要重新考虑数据库布局 至于现在,上面的查询仍然按照要求完成了工作 - 一旦你的表名直接。