使用相关查询时无法使用LIMIT

时间:2017-08-28 19:34:06

标签: sql postgresql greatest-n-per-group

我在Postgres有两张桌子。我想从表格中获取最新的3记录数据。

以下是查询:

select two.sid as sid,
       two.sidname as sidname,
       two.myPercent as mypercent,
       two.saccur as saccur,
       one.totalSid as totalSid 
from table1 one,table2 two 
where one.sid = two.sid;

以上查询显示检查条件的所有记录one.sid = two.sid;我想从table2中仅获取最近3条记录数据(4,5,6)。

我知道在Postgres中我们可以使用limit来限制要检索的行,但是在table2中,对于每个ID,我有多行。所以我想我不能在table2上使用限制,但应该在table1上使用。有什么建议吗?

表1:

sid totalSid
1   10
2  20
3  30
4  40
5  50
6  60

表2:

sid sidname myPercent saccur 
1   aaaa        11    11t
1   bbb         13    13g
1   ccc         11    11g
1   qw          88    88k
//more data for 2,3,4,5....
6    xyz    89    895W     
6    xyz1       90    90k
6    xyz2       91    91p
6    xyz3       92    92q

1 个答案:

答案 0 :(得分:1)

如果对问题的理解有所改变,那么简单的子查询和连接就足够了。

我们选择从table1限制到sid顺序desc中的3条记录的所有内容。这为我们提供了3个最新的Sid,然后加入table2以获取其他SID相关数据。这里的假设是SID在表1中是唯一的,“最近的”是具有最高SID的那些记录。

SELECT two.sid as sid
     , two.sidname as sidname
     , two.myPercent as mypercent
     , two.saccur as saccur
     , one.totalSid as totalSid 
FROM  (SELECT * FROM table1 ORDER BY SID DESC LIMIT 3) one
INNER JOIN table2 two 
  ON one.sid = two.sid;

*注意我在上面的一个别名后删除了一个逗号。

以下我们使用,表示法恢复了ANSI 88连接语法。

SELECT two.sid as sid
     , two.sidname as sidname
     , two.myPercent as mypercent
     , two.saccur as saccur
     , one.totalSid as totalSid 
FROM (SELECT * FROM table1 ORDER BY SID DESC LIMIT 3) one
   , table2 two 
WHERE one.sid = two.sid;

这个语法基本上说是从表1中获取3个最新的SID并将其连接(对于一个匹配中的每个记录,它与两个中的所有记录),对于表2中的所有记录,然后只返回具有相同SID的记录在双方。现代编译器可能能够使用基于成本的优化来提高性能,从而无需进行整个交叉连接;但是,操作顺序说这是数据库通常必须做的事情。如果一个和两个都是实际大小的表,你可以看到交叉连接可能导致一个非常大的临时数据集