1

为简单起见,假设我有一个包含 2 个字段的表 - PERSON_NAME 和 COMPANY_ID 与这些对:

('a',1) ('b',1) ('c',2) ('d',2) ('e',3)

PERSON_NAME a 和 b 在 COMPANY_ID 1 中工作,依此类推。

我想为前 2 个(或 N 个)COMPANIES 选择所有行 -

('a',1) ('b',1) ('c',2) ('d',2)

我不知道每个 COMPANY_ID 有多少行。

GROUP BY 在这里不起作用,因为我需要每个 COMPANY_ID 中的所有行。
这个有效 -

SELECT * FROM T
WHERE COMPANY_ID in (SELECT DISTINCT COMPANY_ID
                     FROM T
                     ORDER BY 1 DESC
                     LIMIT N)

但由于绩效是一个问题,这还不够(大约有 25,000 家公司,每个公司大约有 5-15 人)。N 通常为 500。

4

1 回答 1

2

将其作为连接执行:

SELECT T.*
FROM T join
     (SELECT DISTINCT COMPANY_ID
      FROM T
      ORDER BY 1 DESC
      LIMIT N
     ) TN
     on TN.COMPANY_ID = T.COMPANY_ID;

显式连接通常比inwhere子句中执行得更好。

于 2013-08-31T15:57:34.197 回答