ÑÎÎÒÍÅÑÅÍÍÛÅ ÏÎÄÇÀÏÐÎÑÛ Â ÏÐÅÄËÎÆÅÍÈÈ HAVING

Òàêæå êàê ïðåäëîæåíèå HAVING ìîæåò áðàòü ïîäçàïðîñû, îí ìîæåò áðàòü è ñîîòíåñåííûå ïîäçàïðîñû. Êîãäà âû èñïîëüçóåòå ñîîòíåñåííûé ïîäçàïðîñ â ïðåäëîæåíèè HAVING, âû äîëæíû îãðàíè÷èâàòü âíåøíèå ññûëêè ê ïîçèöèÿì êîòîðûå ìîãëè áû íåïîñðåäñòâåííî èñïîëüçîâàòüñÿ â ñàìîì ïðåäëîæåíèè HAVING. Âû ìîæåòå âñïîìíèòü ÷òî ïðåäëîæåíèå 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.