我在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
答案 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的记录在双方。现代编译器可能能够使用基于成本的优化来提高性能,从而无需进行整个交叉连接;但是,操作顺序说这是数据库通常必须做的事情。如果一个和两个都是实际大小的表,你可以看到交叉连接可能导致一个非常大的临时数据集