我有兩個表 - 國家(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