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

标签 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 的所有记录;我只想从表 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/

相关文章:

c# - 在 C# 中使用 "%"运算符的 sql 删除查询

sql - PostgreSQL 中的全文搜索与模糊搜索相结合

postgresql - 将 postgreSql 数据与 ElasticSearch 同步

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

sql - 选择所有线程并按最新线程排序

mysql - 检索每组中的最后一条记录 - MySQL

php - MySQL 头痛,我应该还是不应该?

mysql - SQL 子查询/左连接问题

postgresql - pg_archivecleanup 和流复制

postgresql - 减少Postgres Docker的日志输出?