|
| 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.
| |
|
|