SQL Vaicājums
Kā MS SQLā vienai tabulai piedžoinot apakšvaicājumu (atlasīt ierakstus no otrās tabulas), kurš atgriež nevis kādu no agregātfunkcijām (piemēram: min, max), bet gan pirmo ierakstu, kad apakšvaicājums ir sakārtots pēc kāda lauka? Apakšvaicājumu likt blakus pamattabulas atlasāmajiem laukiem neder, citādi uz katra pamatvaicājuma atlasītās rindas būs savs apakšvaicājums, rezultātā smags i/o operāciju apjoms, nemaz nerunājot par izpildes laiku, kad pamatvaicājums atlasa pāris simtus tūkstošus rindiņas :)
wolands (2010-09-23 12:23)
Nu gan izvēle uzdot dzili tehnikus jautājumus šeit. :O MS SQL nelietoju, bet uz visiem šiem jautājumiem taču ir google:
http://www.select-sql.com/mssql/how-to-make-limit-from-to-in-mssql-2005.html
Kā MS SQL aptimizē pieprasījumus nezinu - parastio var iedot kādus optimizatora hintus par joiniem, bet kā to dara MS SQL nāksies meklēt tehniskajā dokumentācijā. Standarta SQL neko tādu negarantē. Var gadīties, ka storēta procedūra būs efektīgāka, kā viens queris, bet nu tas nui gan no paša SQL optimizatora ir stipri atkarīgs.
Lakstu_puve (2010-09-23 12:33) SELECT TOP 1
LabsRiits (2010-09-23 12:45)
parastā gadījumā jā top 1, bet ne apakšselektā, tam redz vajagot agregātfunkcijas :)
vienreiz bija tāds variants ar jāraksta, un škiet izdevās, tik scritpu nevaru atrast :(
LabsRiits (2010-09-23 12:50) saliekot pareizos where nosacījumus apakšselektā, nav problēmas atlasīt vajadzīgo rindiņu, bet problēma tajā, ka no tā apakšselekta vajag vairāk kā vienu lauku, līdz ar to grupēšana pēc vairākiem laukiem kombinācijā vairs īsti neiet krastā.
Satelits_Dzeja (2010-09-23 13:01) Man jau šķiet, ka šajos gadījumos ir jāizmanto ADO vai DAO Recordset. Tas nav SQL, bet no MS VB rīkiem jaudīgākais un to arī visplašāk izmanto, aizstājot to pašu SQL. SQL iespējas vienkārši ir ierobežotākas un iespējams šis ir tas gadījums. Es kādreiz arī mēģināju SQL, bet tad vajadzības auga un SQL vairāk nevarēju izdomāt. VB tādā ziņā ir pateicīgs un samērā saprotams un netā ir ļoti daudz jau gatavi piemēri.
Satelits_Dzeja (2010-09-23 13:03) Tīri personiski arī pārskatāmība Recordsetiem ir labāka un nav tur tie ntie where un selecti, lai gan operācija it kā pēc būtības ir vienkārša.
LabsRiits (2010-09-23 13:15)
Tas man vajadzīgs vienreizējam pasākumam, izmainot noteikta apjoma datus. Nē, nu jau problēmas sataisīt ar kursoriem un tad visu fetchot. Bet dotā gadījumā vajag, lai izpildās pārskatāmi ātri produkcijas vidē :)
Gan jau atradīšu kā, vienkārši intereses pēc izveidoju šo topiku, lai redzētu, vai runā arī ne tikai par seksu :DDDD
wolands (2010-09-23 14:10)
Ja MS SQL ir labs optimizators, tad WHERE EXISTS ( subquery ) tiks nooptimizēts, lai lasītu tikai indeksu (ja salīdzināmie lauki, protams ir indeksēti). Bet inner join vienmēr būs ātrāki - varbūt savu pieprasījumu vari pārrakstīt kā inner join?
Ja nē, tad storēta procedūra būs nākamā ātrākā (uzmanīgi rakstot querus). Cursori klienta programmā noteikti būs lēnāki (katrs jauns pieprasījums jāsūta uz serveri utt).