我有两个表 - 国家(id,name)和用户(id,name,country_id)。每个用户都属于一个国家。我想从同一个随机国家中选择10个随机用户。但是,有些用户少于10个的国家/地区,因此我无法使用它们。我只需要选择那些至少有10个用户的国家。Oracle - 优化SQL查询
我可以写这样的事:
SELECT * FROM(
SELECT *
FROM users u
{MANY_OTHER_JOINS_AND_CONDITIONS}
WHERE u.country_id =
(
SELECT *
FROM
(
SELECT c.id
FROM countries c
JOIN
(
SELECT users.country_id, COUNT(*) as cnt
FROM users
{MANY_OTHER_JOINS_AND_CONDITIONS}
GROUP BY users.country_id
) X ON X.country_id = c.id
WHERE X.cnt >= 10
ORDER BY DBMS_RANDOM.RANDOM
) Y
WHERE ROWNUM = 1
)
ORDER BY DBMS_RANDOM.RANDOM
) Z WHERE ROWNUM < 10
然而,在我的实际情况,我有更多的条件,并加入到其他表以确定哪些用户是适用的。通过使用这个查询,我必须在两个地方有这些条件 - 在查询中实际选择数据并在count子查询中。
有没有办法如何写这样的查询,但没有在两个地方的其他条件(这可能不是很好的性能方面)?
你可以为'{MANY_OTHER_JOINS_AND_CONDITIONS}'创建一个视图... –
嗨,我认为在这里优化的最佳方式是使用正确的连接,有时嵌套查询代价高昂。而不是嵌套查询使用左或内部联接取决于需要。 –
@UsagiMiyamoto为了任何人长期维护这一点 - 不要在视图中隐藏复杂性 – Palcente