ÑÎÎÒÍÅÑÅÍÍÛÅ ÏÎÄÇÀÏÐÎÑÛ Â ÏÐÅÄËÎÆÅÍÈÈ 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.