/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
En dato-liste med tomme poster
Fra : Thorkil Olesen


Dato : 09-03-08 20:01

Jeg har brug for en Select, som laver en liste med fortløbende datoer -
også med tomme poster, fra en tabel med data registret med dato.
Tabellen har ikke data for alle datoer, og der skal desuden søges på
andre kriterier i tabellen end dato.

Den eneste måde, jeg kan regne ud, er at oprette en kalender-tabel med
alle datoer, og bruge en LEFT JOIN.

Er der måden?

Eksempel:

SELECT * FROM kalender LEFT JOIN data
ON kalender.dato = data.dato
AND ...[kriterier i data-tabellen]...
WHERE kalender.dato BETWEEN [startdato] AND [slutdato]
ORDER BY kalender.dato

Mit næste problem er at lave det om til et view, men følgende vil ikke
virke:

SELECT * FROM kalender LEFT JOIN data
ON kalender.dato = data.dato
WHERE kalender.dato BETWEEN [startdato] AND [slutdato]
AND ...[kriterier i data-tabellen]...
ORDER BY kalender.dato

Og derfor kan jeg ikke bruge dette view:

CREATE VIEW kal_data AS
SELECT * FROM kalender LEFT JOIN data
ON kalender.dato = data.dato

Nogen ideer?

(Jeg kører PostgreSQL, men problemet burde være generelt for SQL.)

--
Thorkil Olesen,
Hanstholm.

 
 
Troels Arvin (09-03-2008)
Kommentar
Fra : Troels Arvin


Dato : 09-03-08 22:54

On Sun, 09 Mar 2008 20:01:07 +0100, Thorkil Olesen wrote:
> Den eneste måde, jeg kan regne ud, er at oprette en kalender-tabel med
> alle datoer, og bruge en LEFT JOIN.

Jeg tror, det er en løsning, man ser mange steder, og den er i og for sig
fin.

(Man kunne godt ønske sig, at der i databaser var en række "leksikon"-
tabeller med forskellige kalendre, landekode/tidszone/valuta/...-
mappings, m.v. Evt. implementeret som virtuelle tabeller, der på "lazy"
vis udfoldede sig efter behov.)

> Mit næste problem er at lave det om til et view, men følgende vil ikke
> virke:
>
> SELECT * FROM kalender LEFT JOIN data ON kalender.dato = data.dato
> WHERE kalender.dato BETWEEN [startdato] AND [slutdato] AND ...[kriterier
> i data-tabellen]... ORDER BY kalender.dato

Hvilken fejlmeddelelse får du? Noget, der lige springer i øjnene er ORDER
BY, som ikke rigtig giver mening i et view.

--
Regards,
Troels Arvin <troels@arvin.dk>
http://troels.arvin.dk/

Thorkil Olesen (12-03-2008)
Kommentar
Fra : Thorkil Olesen


Dato : 12-03-08 01:16

Troels Arvin <troels@arvin.dk> wrote:

> On Sun, 09 Mar 2008 20:01:07 +0100, Thorkil Olesen wrote:
> > Den eneste måde, jeg kan regne ud, er at oprette en kalender-tabel med
> > alle datoer, og bruge en LEFT JOIN.
>
> Jeg tror, det er en løsning, man ser mange steder, og den er i og for sig
> fin.

OK.

> (Man kunne godt ønske sig, at der i databaser var en række "leksikon"-
> tabeller med forskellige kalendre, landekode/tidszone/valuta/...-
> mappings, m.v. Evt. implementeret som virtuelle tabeller, der på "lazy"
> vis udfoldede sig efter behov.)

Ja, netop. Det må vi ønske hos udviklerne...

> > Mit næste problem er at lave det om til et view, men følgende vil ikke
> > virke:
> >
> > SELECT * FROM kalender LEFT JOIN data ON kalender.dato = data.dato
> > WHERE kalender.dato BETWEEN [startdato] AND [slutdato] AND ...[kriterier
> > i data-tabellen]... ORDER BY kalender.dato
>
> Hvilken fejlmeddelelse får du? Noget, der lige springer i øjnene er ORDER
> BY, som ikke rigtig giver mening i et view.

Nej, ORDER BY og WHERE-udtrykket skal selvfølgelig ikke med i view'et.

Fejlen i ovenstående er, at hvis der for en dato eksisterer en post, som
ikke opfylder kriterierne, så kommer den med i JOIN'et, men blive
udelukket af WHERE-udtrykket. Datoen falder derfor helt ud i resultatet.

Hvis jeg i stedet putter kriteriet op i ON-udtrykket, så virket det
fint, men jeg kan ikke lave et view ud af det.

--
Thorkil Olesen,
Hanstholm.

Jens Gyldenkærne Cla~ (12-03-2008)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 12-03-08 14:54

Thorkil Olesen skrev:

> Fejlen i ovenstående er, at hvis der for en dato eksisterer en
> post, som ikke opfylder kriterierne, så kommer den med i
> JOIN'et, men blive udelukket af WHERE-udtrykket. Datoen falder
> derfor helt ud i resultatet.

Hvis kriterierne for data-tabellen er konstante, kan de lægges ind
før viewet:

CREATE VIEW ok_data AS
SELECT * FROM data
WHERE [...datakriterier...]

CREATE VIEW kal_data AS
SELECT * FROM kalender LEFT JOIN ok_data
ON kalender.dato = ok_data.dato


Alternativt kan du bruge et flag til at markere datamatch:

SELECT CASE WHEN [datakriterier] THEN 1 ELSE 0 END AS datamatch, *
FROM kal_data
WHERE dato BETWEEN [startdato] and [slutdato]

(ovenstående er MSSQL-syntaks, men jeg gætter på at postgreSQL har
noget tilsvarende)


--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Thorkil Olesen (13-03-2008)
Kommentar
Fra : Thorkil Olesen


Dato : 13-03-08 23:17

Jens Gyldenkærne Clausen <jens@gyros.invalid> wrote:

> Thorkil Olesen skrev:
>
> > Fejlen i ovenstående er, at hvis der for en dato eksisterer en
> > post, som ikke opfylder kriterierne, så kommer den med i
> > JOIN'et, men blive udelukket af WHERE-udtrykket. Datoen falder
> > derfor helt ud i resultatet.
>
> Hvis kriterierne for data-tabellen er konstante, kan de lægges ind
> før viewet:

Det er de ikke

> CREATE VIEW ok_data AS
> SELECT * FROM data
> WHERE [...datakriterier...]
>
> CREATE VIEW kal_data AS
> SELECT * FROM kalender LEFT JOIN ok_data
> ON kalender.dato = ok_data.dato
>
>
> Alternativt kan du bruge et flag til at markere datamatch:
>
> SELECT CASE WHEN [datakriterier] THEN 1 ELSE 0 END AS datamatch, *
> FROM kal_data
> WHERE dato BETWEEN [startdato] and [slutdato]
>
> (ovenstående er MSSQL-syntaks, men jeg gætter på at postgreSQL har
> noget tilsvarende)

Syntaksen er god nok, men formålet kan jeg ikke fange...

--
Thorkil Olesen,
Hanstholm.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste