ÑÎÎÒÍÅѨÍÍÛÅ ÏÎÄÇÀÏÐÎÑÛ Â ÏÐÅÄËÎÆÅÍÈÈ HAVING
Ïðåäëîæåíèå HAVING ìîæåò ïðèíèìàòü ïîäçàïðîñû è ñîîòíåñ¸ííûå ïîäçàïðîñû. Êîãäà âû èñïîëüçóåòå ñîîòíåñ¸ííûé ïîäçàïðîñ â ïðåäëîæåíèè HAVING, âû äîëæíû îãðàíè÷èâàòü âíåøíèå ññûëêè íà ïîçèöèè, êîòîðûå ìîãëè áû íåïîñðåäñòâåííî èñïîëüçîâàòüñÿ â ñàìîì ïðåäëîæåíèè HAVING. Âû ïîìíèòå èç Ãëàâû 6, ÷òî ïðåäëîæåíèå HAVING ìîæåò èñïîëüçîâàòü òîëüêî àãðåãàòíûå ôóíêöèè, êîòîðûå óêàçàíû â èõ ïðåäëîæåíèè SELECT, èëè ïîëÿ, èñïîëüçóåìûå â èõ ïðåäëîæåíèè GROUP BY. Îíè ÿâëÿþòñÿ òîëüêî âíåøíèìè ññûëêàìè, êîòîðûå âû ìîæåòå äåëàòü. Âñ¸ ýòî ïîòîìó, ÷òî ïðåäèêàò ïðåäëîæåíèÿ HAVING îöåíèâàåòñÿ äëÿ êàæäîé ãðóïïû èç âíåøíåãî çàïðîñà, à íå äëÿ êàæäîé ñòðîêè. Ñëåäîâàòåëüíî, ïîäçàïðîñ áóäåò âûïîëíÿòüñÿ îäèí ðàç äëÿ êàæäîé ãðóïïû, âûâåä¸ííîé èç âíåøíåãî çàïðîñà, à íå äëÿ êàæäîé ñòðîêè. Ïðåäïîëîæèì, ÷òî âû õîòèòå ñóììèðîâàòü çíà÷åíèÿ ñóìì ïðèîáðåòåíèé ïîêóïîê èç òàáëèöû Çàêàçîâ, ñãðóïïèðîâàâ èõ ïî äàòàì, óäàëèâ âñå äàòû, ãäå áû SUM íå áûë ïî êðàéíåé ìåðå íà 2000.00 âûøå ìàêñèìàëüíîé (MAX) ñóììû:
SELECT odate, SUM (amt) FROM Orders a GROUP BY odate HAVING SUM (amt) > ( SELECT 2000.00 + MAX (amt) FROM Orders b WHERE a.odate = b.odate );
Ïîäçàïðîñ âû÷èñëÿåò çíà÷åíèå MAX äëÿ âñåõ ñòðîê ñ òîé æå ñàìîé äàòîé, ÷òî è ó òåêóùåé àãðåãàòíîé ãðóïïû îñíîâíîãî çàïðîñà. Ýòî äîëæíî áûòü âûïîëíåíî, êàê è ðàíåå, ñ èñïîëüçîâàíèåì ïðåäëîæåíèÿ WHERE. Ñàì ïîäçàïðîñ íå äîëæåí èñïîëüçîâàòü ïðåäëîæåíèÿ GROUP BY èëè HAVING.