Avatar billede hugopedersen Nybegynder
21. januar 2009 - 12:35 Der er 15 kommentarer og
1 løsning

Kan det virkelig passe

Jeg sidder her og vil flytte nogle standard queries over på en MySQL server men den brokker sig konsekvent når jeg vil have den til at finde MAX af et felt.
Kan det virkeligt passe at den ikke understøtter en standard SQL-92 funktion. Eller er det bare mig der overser noget.
Avatar billede fsconsult.dk Nybegynder
21. januar 2009 - 12:41 #1
nej, det kan man sagtens.  du har formentlig glemt at lave group by på felter i din forespørgsel, som ikke bruger aggregerede funktioner  (som MAX)
Avatar billede hugopedersen Nybegynder
21. januar 2009 - 12:47 #2
Rettelse:  Det er selvfølgelig ikke MAX jeg mener.

Det er LAST

Jeg beklager fejlen.
Avatar billede fsconsult.dk Nybegynder
21. januar 2009 - 13:07 #3
kender slet ikke LAST. er det standard SQL-92 ??  har du et link eller eksempel ?
Avatar billede hugopedersen Nybegynder
21. januar 2009 - 14:53 #4
SELECT tblcentercounters.CenterID, tblcentercounters.KabineNo, Max(tblcentercounters.Tidspunkt) AS MaxOfTidspunkt, Last(tblcentercounters.BehandPris) AS LastOfBehandPris, Last(tblcentercounters.BehandTid) AS LastOfBehandTid
FROM tblcentercounters
GROUP BY tblcentercounters.CenterID, tblcentercounters.KabineNo
HAVING (((tblcentercounters.KabineNo)>0 And (tblcentercounters.KabineNo)<100));

Sådan ser queryen ud i M$ Access
Avatar billede fsconsult.dk Nybegynder
21. januar 2009 - 14:56 #5
Nu er M$ Access jo ikke just en referencedatabase ;)

Men hvad er forskellen på MAX og LAST ?
Avatar billede hugopedersen Nybegynder
21. januar 2009 - 15:19 #6
Du kan overføre den til M$ SQL og det må da siges at være en af de etablerede.

Hvis jeg bruger last får jeg den rigtige pris, hvis jeg bruger max får jeg ikke den rigtige - det er det lidt svævende svar.

Jeg ved ikke lige hvad den tekniske forskel er.
Avatar billede arne_v Ekspert
21. januar 2009 - 15:47 #7
Jeg mener at LAST returnerer den sidste og det er jo ikke noedvendigvis den stoerste.

Jeg gaetter paa at du i MySQL skal have lavet en subquery med en ORDER BY of en LIMIT 1.
Avatar billede hugopedersen Nybegynder
21. januar 2009 - 16:18 #8
Man skal nok på en eller anden finurlig måde kunne få det ønskede resultat, men jeg synes da bare det er underligt at kommandoen ikke findes når den er med på SQL-92 listen.
Avatar billede fsconsult.dk Nybegynder
21. januar 2009 - 19:10 #9
er der nogen der har et link til SQL92 definitionen?  jeg kan altså ikke mindes at have hørt om LAST før, og google kommer ik med nogen brugelige hits.
Avatar billede arne_v Ekspert
22. januar 2009 - 01:47 #10
Funktionen er ikke i SQL92 .

SQL92 bruger LAST i en lidt anden sammenhæng:
  FETCH LAST FROM mycursor
Avatar billede hugopedersen Nybegynder
22. januar 2009 - 07:15 #11
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
http://savage.net.au/SQL/sql-2003-2.bnf

Hvordan LAST bruges skal jeg ikke kunne sige, men det ser ud til at den finder sidste record i den række af records der opfylder kriterierne. Og det er den record jeg har brug for i mit tilfælde da det er den sidste nye pris.
Men måske er jeg nødt til at tænke alternativt og lave nogle flere queries for at få det ønskede resultat.
Avatar billede arne_v Ekspert
23. januar 2009 - 00:41 #12
Det er FETCH fra en cursor ikke en almindelig SELECT.
Avatar billede hugopedersen Nybegynder
23. januar 2009 - 06:52 #13
Den må du nok lige uddybe lidt.
Avatar billede arne_v Ekspert
24. januar 2009 - 04:18 #14
Lad os kigge på den avancerede tabel foobar med indholdet:

id    k    v
1    1    2
2    1    1
3    1    4
4    1    3
5    2    0

I MS Access vil queryen:

SELECT k, FIRST(v), LAST(v)
FROM foobar
GROUP BY k;

eller lidt mere korrekt:

SELECT k, FIRST(v), LAST(v)
FROM (SELECT * FROM foobar ORDER BY id) x
GROUP BY k;

give output:

k    Expr1001    Expr1002
1    2    3
2    0    0

Mens på SQLServer og diverse andre databaser vil SQL'en:

DECLARE c CURSOR SCROLL FOR SELECT * FROM foobar ORDER BY id
OPEN c
FETCH FIRST FROM c
FETCH LAST FROM c
CLOSE c
DEALLOCATE c
GO

give output:

id          k          v
----------- ----------- -----------
          1          1          2

(1 row affected)
id          k          v
----------- ----------- -----------
          5          2          0

(1 row affected)

De to ting er lidt beslægtede men alligevel klart forskellige.

MS Access LAST er komplet MS Access specifik.

FETCH LAST er ANSI SQL og implementeret i SQLServer, PostgreSQL og formentlig flere.

Men den mangler også i mange databaser bl.a. i MySQL.

Men så vidt jeg ved også i Oracle og DB2.
Avatar billede hugopedersen Nybegynder
02. februar 2009 - 13:09 #15
Nogle svar for input så jeg kan lukke.

(løsningen blev indtil videre at køre videre med queries bygget i Access)
Avatar billede arne_v Ekspert
03. februar 2009 - 02:29 #16
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester