/ 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
[MSSQL] Find tredje post
Fra : Jens Gyldenkærne Cla~


Dato : 21-08-03 15:09

Jeg er stødt på et problem med en trigger.

I et annoncesystem er der bl.a. følgende tabeller:

Medlemsannoncer:
   annID (primærnøgle)
   perID (periodeID, fremmednøgle til perioder)
   slutdato
   ...

AnnoncePerioder
   perID
   perNavn (navn på perioden - pt. 2 værdier: 1 nummer/3 numre

Udgivelser
   uID (nøgle)
   navn
   udgivelsesdato
   annoncedeadline
   stopdato


Når man indtaster en annonce skal slutdatoen beregnes af triggeren
ud fra perioden. Hvis perioden er 1 nummer (af et trykt blad), kan
slutdatoen findes i feltet stopdato i udgivelsestabellen - det er
ikke noget problem at få fat i. Men, når perioden er mere end 1
nummer, skal jeg finde stopdatoen for den udgivelse der ligger x
gange frem. Med perioden 3 numre er det således post nr 3 der skal
findes.

Jeg kan nemt finde de tre numre en annonce skal tilknyttes - det
ser således ud:

   SELECT TOP 3 *
   FROM udgivelser
   Where annoncedeadline > getdate()
   order by udgivelsesdato

Her skulle jeg så kunne vende postsættet og bare fiske nr. 1 ud -
men det kan jeg ikke finde ud af. Hvis det ikke var for
sorteringen, kunne jeg lave ovenstående select til et view, og så
trække den største værdi af stopdato ud herfra. Men et view kan jo
ikke indeholde sortering.

Jeg kan heller ikke bare pakke select-sætningen ind i parenteser og
vende sorteringen på den måde:

   SELECT TOP 1 * FROM (
       <selectsætningen ovenfor>
   )
   ORDER BY udgivelsesdato DESC


Gode forslag modtages med kyshånd.
--
Jens Gyldenkærne Clausen
Greenwich nedrig gang: Ny Delhi (GMT +5.5), Badutspring By (GMT
+2), Ny York (GMT 5), Høns (GMT 6), Los Engel (GMT 8)
(Fra <http://www.paris-tours-guides.com/index_danish.shtml>)

 
 
Troels Arvin (21-08-2003)
Kommentar
Fra : Troels Arvin


Dato : 21-08-03 21:29

On Thu, 21 Aug 2003 16:09:12 +0200, Jens Gyldenkærne Clausen wrote:

> Her skulle jeg så kunne vende postsættet og bare fiske nr. 1 ud - men
> det kan jeg ikke finde ud af.

Prøv at tænke "limit 1 offset 2" (PostgreSQL-jargon) og se så om
http://troels.arvin.dk/db/rdbms/#select-limit-offset kan hjælpe.

> Men et view kan jo ikke indeholde sortering.

Er du 100% sikker på det?

> Jeg kan heller ikke bare pakke select-sætningen ind i parenteser og
> vende sorteringen på den måde:
>
>    SELECT TOP 1 * FROM (
>        <selectsætningen ovenfor>
>    )
>    ORDER BY udgivelsesdato DESC

Jeg havde også bøvl med det på et tidspunkt, men jeg endte med at få
det til at lykkes også i MSSQL ved at pakke tingene ind i flere "lag"
subqueries, jvf. førnævnte link.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Peter Lykkegaard (21-08-2003)
Kommentar
Fra : Peter Lykkegaard


Dato : 21-08-03 22:19

Troels Arvin wrote:
> On Thu, 21 Aug 2003 16:09:12 +0200, Jens Gyldenkærne Clausen wrote:
>
>> Men et view kan jo ikke indeholde sortering.
>
> Er du 100% sikker på det?
>
Views på MSSQL 2000 (og tidligere) giver en fejl hvis man indsætter "ORDER
BY"

mvh/Peter Lykkegaard



Thorbjoern Ravn Ande~ (21-08-2003)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 21-08-03 23:23

"Peter Lykkegaard" <polonline@hotmail.dk> writes:

> Views på MSSQL 2000 (og tidligere) giver en fejl hvis man indsætter "ORDER
> BY"

Et subselect under Oracle 7 betragtes som et view, og et sådant kan
ikke indeholde en order by. Det er heldigvis fikset i Oracle 9.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Jens Gyldenkærne Cla~ (22-08-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 22-08-03 08:56

Troels Arvin skrev:

> Prøv at tænke "limit 1 offset 2" (PostgreSQL-jargon)

Den ville være smart.

> og se så om http://troels.arvin.dk/db/rdbms/#select-limit-offset
> kan hjælpe.

Ah..... nu faldt tiøren. Jeg havde glemt at give den indre
selectsætning et alias.

   SELECT TOP 1 * FROM
       ( <subselect> )
   ORDER BY udgivelsesdato DESC    

- virker ikke, mens

   SELECT TOP 1 * FROM
       ( <subselect> ) AS bar
   ORDER BY udgivelsesdato DESC    

- virker perfekt.


>> Men et view kan jo ikke indeholde sortering.
>
> Er du 100% sikker på det?

Ja.


> Jeg havde også bøvl med det på et tidspunkt, men jeg endte med
> at få det til at lykkes også i MSSQL ved at pakke tingene ind
> i flere "lag" subqueries, jvf. førnævnte link.

Tricket er tilsyneladende at man skal huske alias til subqueryen.
Tak for hjælpen.
--
Jens Gyldenkærne Clausen
Greenwich nedrig gang: Ny Delhi (GMT +5.5), Badutspring By (GMT
+2), Ny York (GMT 5), Høns (GMT 6), Los Engel (GMT 8)
(Fra <http://www.paris-tours-guides.com/index_danish.shtml>)

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

Månedens bedste
Årets bedste
Sidste års bedste