Mis probleem tekib MS Accessi andmebaasi kasutamisel universaalse andmebaasi haldamise programmi (nt DBeaver ja DbSchema) kaudu?

Postitas Erki Eessaar 19.03.2023 13:38 (muudeti 19.03.2023 13:44)
Nende vahendite kaudu saab käivitada SQL lauseid, mis on
  • illegaalne SQL,
  • ei ole kooskõlas MS Accessi SQL dialektiga, st lauseid otse andmebaasisüsteemis käivitades need ei toimi.

Põhjus saab olla selles, et see programm kui vahendaja kirjutab lauseid enne käivitamist ümber andmebaasisüsteemile sobivaks. See muutub probleemiks, kui  sellise vahenda puudumisel ei oska kasutaja andmebaasisüsteemis toimivat koodi kirjutada.

Esitan järgnevalt näiteid.

Illegaalse SQLi näide

SELECT [oppimine] , tulemus
FROM [Oppimine] INNER JOIN [Eksam] ON Oppimine.[oppimine] =Eksam.[oppimine];

Veerg oppimine on nii tabelites Oppimine kui Eksam. Veerule viidates ei täpsustata tabelit, milles see veerg sisaldub.

Korrektne oleks:

SELECT Oppimine.[oppimine] , tulemus
FROM [Oppimine] INNER JOIN [Eksam] ON Oppimine.[oppimine] =Eksam.[oppimine];

Näited lausetest, mida MS Accessi SQL dialekt ei toeta, kuid mida saan DBeaveris MS Accessi andmebaasi põhjal käivitada

SELECT Count(DISTINCT aine) AS arv
FROM [Oppimine];
--leian erinevate ainete arvu, mida on vähemalt korra õpitud


WITH erinevad AS (SELECT DISTINCT [aine]  FROM [Oppimine])
SELECT Count(*) AS arv
FROM erinevad;
/*ühine tabeli avaldis (Common Table Expression) - deklareerin alampäringu ja siis kasutan*/


SELECT *
FROM [Oppimine]
ORDER BY [oppim_algus] DESC
LIMIT 2;

SELECT *
FROM [Tudeng] INNER JOIN [Oppimine] ON Tudeng.[tudkood] = Oppimine.[tudeng]
INNER JOIN [Aine] ON Oppimine.[aine] = Aine.[aine_kood]
--ühendamisoperatsioonid pole sulgudes

SELECT *
FROM [Tudeng] JOIN [Oppimine] ON Tudeng.[tudkood] = Oppimine.[tudeng]
JOIN [Aine] ON Oppimine.[aine] = Aine.[aine_kood]
--sõna JOIN fraasi INNER JOIN asemel

SELECT *
FROM [Oppimine] INNER JOIN [Eksam] USING (oppimine);
--kompaktsem süntaks ühendamiseks üle samanimeliste veergude

SELECT *
FROM [Oppimine]
WHERE Extract(YEAR FROM [oppim_algus])=1999;
--Extract funktsioon kuupäevast aastaarvu eraldamiseks

SELECT *
FROM [Oppimine]
WHERE [oppim_algus]='1999-09-01'
--Kuupäevastring on ülakomade vahel

Näited SQL lausetes, mida saab MS Accessis otse käivitada

SELECT Count(aine) AS arv
FROM (SELECT DISTINCT [aine]
FROM [Oppimine]) AS ap;

SELECT *
FROM ([Tudeng] INNER JOIN [Oppimine] ON Tudeng.[tudkood] = Oppimine.[tudeng])
INNER JOIN [Aine] ON Oppimine.[aine] = Aine.[aine_kood]
--sulud ühendamisoperatsioonide ümber

SELECT *
FROM [Oppimine]
WHERE Year([oppim_algus])=1999;
--MS Accessis on funktsioon Year

SELECT *
FROM [Oppimine]
WHERE [oppim_algus]=#1999-09-01#;

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!