Ik denk dat het probleem is dat HAVING wordt toegepast na GROUP BY, maar nog steeds vóór de SELECT-fase. Ik realiseer me dat het verwarrend is omdat de HAVING-clausule verwijst naar een kolom uit de SELECT-instructie, maar ik denk dat het in feite gewoon twee keer uitvoert wat in de SELECT-instructie staat - een keer voor het hebben en dan weer voor de SELECT.
Zie bijvoorbeeld dit antwoord .
Let op, het is vooral verwarrend, want als je verwijst naar een kolomnaam die niet voorkomt in de SELECT-instructie in een HAVING-clausule, wordt er een fout gegenereerd.
Bijvoorbeeld deze viool
Maar volgens die viool hierboven, kun je nog steeds filteren op basis van het resultaat van een functie die niet in de uitvoer verschijnt. Om een lang verhaal kort te maken, de HAVING-clausule doet nog steeds wat je wilt, maar je kunt niet zowel op een willekeurige waarde filteren als deze tegelijkertijd weergeven met die benadering. Als u dat moet doen, moet u eerst een subquery gebruiken om de waarde te corrigeren, waarna de buitenste query erop kan filteren en erop kan worden weergegeven.
Om het duidelijk te maken, is het waarschijnlijk de moeite waard om gewoon RAND() in de hebbende clausule te gebruiken, niet het SQL-gedeelte. Hoewel ik begrijp dat deze vraag waarom is het doet dit in plaats van het probleem specifiek op te lossen.