|
<< Click to Display Table of Contents >> SQL MEMORY mellemlagringer |
![]() ![]()
|
Mellemlagrings-tabeller og MEMORY tabeller
I mange tilfælde vil man have brug for at kunne mellemlagre tabeludtræk, der kan fungere som tabeller for successive udtræk på een eller flere tabeller.
Da sådanne mellemlagringstabeller ofte vil skulle have et dynamisk indhold, er det bedre at have dem som virtuelle tabeller fremfor lagrede tabeller, og som kun eksisterer temporært lagret i computerens RAM (in MEMORY tabeller), hvilket også fritager databasens tabelliste for forstyrrende temporære tabelnavne og deres redundante indhold.
I nogle databaser, som f.eks. Microsoft SQL Server, kan definitioner af temporære udtræk lagres i databasen som såkaldte SQL Views, der på lige fod med tabeller kan kaldes i SQL-udtryk.
I andre databaser, som f.eks. den her i NeoBasen anvendte, er disse temporære udtræk nødt til at være defineret som en del af det samlede SQL-udtryk (script), som så til gengæld runtime kan sammenkædes ad hoc som implementeret ved GA- eller FV-grupperingerne i programmets Bruger-SQL vindue.
RAM-lagrede virtuelle tabeller markeres i AbsDB med prædikatet MEMORY foran tabelnavnet, f.eks.:
SELECT * INTO MEMORY Temp FROM KildeTabel;
hvor "Temp" er et arbitrært valgt navn for denne temporære tabel.
Funktionen har sin specielle værdi, hvis et successivt SQL-udtryk kun kan bruge det aggregerede (her COUNT) resultat umiddelbart fra den første tabel, som så her er mellemlagret som en temporær virtuel tabel.
Et eksempel er fremfinding af børn med flere indlæggelser ved forespørgsel overfor tabellen med indlæggelsesdata (Neobase2) som i:
SELECT PersonId, COUNT(*) AS "Antal indl."
FROM Neobase2
GROUP BY PersonId
HAVING COUNT(*) > 1;
samtidigt med at der ønskes selekteret på f.eks. fødselsår ved forespørgsel overfor fødselsdatoer i tabellen med NeoBase Basisdata (NeoPers) som i:
SELECT PersonId, Fodselsdato
FROM NeoPers
WHERE EXTRACT(YEAR FROM Fodselsdato) = 2010;
der ved sammenkædning i et SQL script (flere successive deludtryk) kan se sådan ud:
SELECT PersonId, COUNT(*) AS "Antal indl."
INTO MEMORY Temp
FROM Neobase2
GROUP BY PersonId
HAVING COUNT(*) > 1;
SELECT np.PersonId, Fodselsdato, mt.[Antal indl.]
FROM NeoPers AS np, MEMORY Temp AS mt
WHERE EXTRACT(YEAR FROM Fodselsdato) = 2010
AND np.PersonId = mt.PersonId;
hvor hvert deludtryk afsluttes med semikolon og det andet deludtryk sammenkædes med det første ved forespørgsel overfor den temporære tabel "Temp".
_____________________________
27-10-2017 - © 2003-2017 Niels Knabe