为简单起见,假设我有一个包含2个字段的表格 - PERSON_NAME和带有这些字段的COMPANY_ID:
('a',1) ('b',1) ('c',2) ('d',2) ('e',3)
PERSON_NAME a和b正在使用COMPANY_ID 1,依此类推。
我想为前2个(或N个)公司选择所有行 -
('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。
答案 0 :(得分:1)
将此作为联接来代替:
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;
显式联接的效果通常优于in
子句中的where
。