Avatar billede jmp.dk Nybegynder
25. august 2006 - 10:31 Der er 9 kommentarer og
1 løsning

Sql Query

Jeg skal bruge en advanceret sql query. Forklarer bedst igennem eksempler, saa her kommer det.

Jeg har to tabller:

Person                    Contacts
------------------        ---------------
ID      NAME              Person_id  Date
----    -----------      ----        ----------
1      Hans              1          15/02/2005
2      Per              1          29/03/2005
3      Ulla              1          12/01/2006
                          2          15/04/2006

Det jeg har brug for er en query der giver den nummebr X contakt
Select bla bla bla where contactnumber=2
Skal give:
---------------
Hans  29/03/2005
Per    NULL
Ulla  NULL

Select bla bla bla where contactnumber=1
Skal give:
-----------------
Hans  15/02/2005
Per    15/04/2006
Ulla  NULL

osv.

MVH
Jonas
Avatar billede fennec Nybegynder
25. august 2006 - 10:38 #1
Ikke helt med...
Hvad henviser contactnumber=2 til??
Avatar billede jmp.dk Nybegynder
25. august 2006 - 11:00 #2
Ikke noget noget i nogen tabeller det er den dynamiske parameter i saetningen.
Det er det nummer kontakt i den kronologiske raekkefolge af kontakter.
Avatar billede teepee Nybegynder
25. august 2006 - 14:38 #3
Havd indikerer nummer x i rækkefølgen. Sorterer du på datoen?
Avatar billede jmp.dk Nybegynder
25. august 2006 - 14:59 #4
Det jeg skal kunne faa frem er datoen paa aftale nummer x, dvs. hver persons aftale nummer 2 eller hver persons aftale nummer 3 etc.
Hvis en person kun har haft en aftale og der bliver spurgt paa datoen for aftale 2 skal der returneres NULL.
Nummeret paa aftalen bliver defineret ud fra datoen. Saa ja der skal sorteres paa datoen paa en aller anden maade.
Avatar billede janus_007 Nybegynder
26. august 2006 - 00:52 #5
Undskyld jeg lige siger det, men det er altså helt ude i hampen at du baserer at udtræk på en rækkefølge i en tabel der ikke engang indeholder en primærnøgle (ikke at det er umuligt, bare usædvanligt), du vil have problemer med robustheden i resultatet fra gang til gang.

Må jeg ikke anbefale dig at overholde normalformen og bygge evt. et par relationer osv. Det vil gøre det noget nemmere at komme op med en løsning :-)

Hygge
Avatar billede fennec Nybegynder
28. august 2006 - 09:39 #6
Hvis det på nogen måde skal fungere ordentlig, skal du have et ekstra felt på Contacts tabellen, som indeholder aftale nummeret:
[Contacts]
Person_id contactNr Date
1        1        15/02/2005
1        2        29/03/2005
1        3        12/01/2006
2        1        15/04/2006
Avatar billede teepee Nybegynder
28. august 2006 - 10:08 #7
Det ville i hvert fald lave sql'en rimelig simpel (ej afprøvet):

select p.name, c.date
from person p left outer join contacts c on p.id = c.person_id
where contactNr = [x]
Avatar billede jmp.dk Nybegynder
28. august 2006 - 12:56 #8
Janus, eksemplet er bare simplificeret, de "rigtige" tabeller er langt storre og har primaer nogler og foreign keys. Alle tabeller bruger primaer noglen ID som er identity columns. Maaske er det ude i hampen, men ikke desto mindre er det det jeg skal bruge.

Fennec din losning er ikke en option for mig.
At skulle vedligholde den rigtige raekke folge (contact_nr) er haablost, naar man aendrer og sletter aftaler. Det vil betyde store aendringer i min applikation.

Denne Sql skal bruges til en rapport.
Og skal vise ventetiden fra henvisning til x aftale.

Teepee dit svar kan ikke accepteres.
Avatar billede Slettet bruger
28. august 2006 - 14:31 #9
Måske kan denne bruges:

SELECT p.Name, y.dato
FROM
  PERSON p LEFT OUTER JOIN
  ( SELECT Person_id, MAX(Date) dato
    FROM ( SELECT TOP 2 Person_id, Date FROM Contacts ORDER BY Date ) x
    GROUP BY Person_id
  ) y ON p.id=y.Person_id
Avatar billede teepee Nybegynder
28. august 2006 - 14:42 #10
Du får problemer med performance, når du får mange personer og skal bruge den x'ende kontakt osv. Du skal hele tiden sortere i datorangorden, tage top x for derefter at tax max(dato) for hver eneste person... men det finder du nok ud af
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