我在 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 的所有记录;我只想从表 2 中获取最近的 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
最佳答案
鉴于对问题的理解发生了变化,一个简单的子查询和连接就足够了。
我们选择从 table1 limit 到 sid order 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 的记录在两侧。现代编译器可能能够使用基于成本的优化来提高性能,而无需进行整个交叉连接;然而,操作顺序表明这是数据库通常必须做的。如果一个和两个都是相当大的表,您可以看到交叉连接可能会导致非常大的临时数据集
关于sql - 使用相关查询时无法使用 LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45926180/