31. marts 2007 - 00:24Der er
14 kommentarer og 1 løsning
Sql problem med flere tabeller.
Hejsa.
Jeg vil gerne lave en sql der der henter alle kunder der enten har en andel, en leje eller begge, kunden skal kun være repræsenteret en gang i rusultatet.
Jeg har for søgt mange bl.a. flg. dog uden resultat.
SELECT * FROM kunder WHERE Nummer IN (SELECT Nummer FROM andel) OR Nummer IN (SELECT kunde FROM leje)
Jeg håber at der nogen der kan få mig på rette spor.
Du bør undgå subselects da de er meget tunge. Dernæst bør du ikke / aldrig hente alle tabellens (*) felter, men blot de der er nødvendige. Er alle nødvendige, så skriv alle navnene. Scriptet bliver længere, men det er ikke påvirket af nye felter i tabeller og du sparer båndbredde.
Du har tabellerne: Kunder Andel Leje
I tabellen kunder er der fremmednøglerne nummer der peger til andel og kunder der peger over i leje.
Kan det her så ikke gøre det?
select distinct * from kunder where not (nummer is null or kunder is null)
Er det ikke lige meget? Du kigger jo kun om der findes fremmednøgler til de to tabeller. Hvis der ikke gør, er referencen null (det bør den være) eller en værdi der fortæller den er udefineret (eksempelvis 0)
Er det sidste tilfældet må scriptet se således ud:
select distinct * from kunder where not (nummer is null or kunder is null or nummer = 0 or kunder = 0)
Dine fremmednøgler bør fortælle hvilke tabeller der skal kigges i, så hvis du har tabellerne Andel og Leje, kan fremmednøglerne i Kunder eksempelvis hedde Andel_ID og Leje_ID (hvis primærnøglerne i tabllerne altså kaldes ID).
Bedre endnu vil det være om du knyttede not referentiel integritet på din database á la dette (udsnit fra et SQL "Create table"): foreign key(Leje_ID) references Leje(ID) osv.
Man kan ydermere føje nogle constraints på således at sletter du en record i kunder, vil records som kunder peger på også slettes. På den måde holdes databasen fri for "døde" records. Se "on cascade delete / update"
Enten har jeg fuldstændig tabt tråden eller også har ikke stillet mit problem ordenligt op.
jeg har 3 tabeller med bl.a. flg felter.
KUNDER Id Nummer.
ANDEL Id Nummer Kunde_Id
LEJE. Id Nummer Kunde_Id
Jeg vil så gerne vælge de kunder der enten har en ANDEL, og/eller en Leje
Men jeg skal lige have kigget på foreign key, jeg ved ikke lige om jeg kan bruge det da en andel og ikke under normale omstændigheder, skal slettes, den vil jo normalt blive solgt, og jeg kan vel ikke bare ændre en foeign key.
Altså at Andel og Leje peger på en kunde-record, ikke den anden vej rundt, sådan som du har lavet det i dit script.
Dine to tabeller Andel og Leje har altså fremmednøgle til Kunder.
Så kan du jo prøve med det her:
select k.id, k.navn, count(a.id) as "andel", count(l.id) as "leje" from kunder k left join andel a on (a.kunde_id = k.id and a.kunde_id is not null) left join leje l on (l.kunde_id = k.id and l.kunde_id is not null) group by k.id, k.navn
Ser man det, jeg har lidt svært ved at finde ud af syntaksen for join, men vil lige ege med dit forslag, i påsken, er dog uden net i sommerhuset. Så du vil høre nærmere senere, jeg er lidt i tvivl om hvorfor du bruger count, men nu vil jeg lige lege med det.
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.