Avatar billede fhansen Praktikant
31. marts 2007 - 00:24 Der 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.

Finn
Avatar billede arne_v Ekspert
31. marts 2007 - 02:45 #1
der er ikke noget galt med ideen i din SQL

så der må være noget i data som driller
Avatar billede fhansen Praktikant
31. marts 2007 - 10:02 #2
Jeg får fejl meddelse der siger noget i stil mad at OR er invalid eller ) er unexpected
Avatar billede hrc Mester
02. april 2007 - 08:12 #3
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)

(og så bytte * ud med de felter du skal bruge)
Avatar billede fhansen Praktikant
03. april 2007 - 01:29 #4
Hmmm, det kan jeg ikke få til at virke, der er jo ikke noget der fortæller hvilke tabeller der skal kigges i
Avatar billede hrc Mester
03. april 2007 - 08:19 #5
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)
Avatar billede hrc Mester
03. april 2007 - 08:25 #6
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"
Avatar billede hrc Mester
03. april 2007 - 08:27 #7
Rettelser:
  - not = noget
  - "vil records som kunder på" -> vil records der peger på kunde-recorden.
Avatar billede fhansen Praktikant
04. april 2007 - 00:32 #8
Hej hrc

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.

Finn
Avatar billede hrc Mester
04. april 2007 - 07:49 #9
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
Avatar billede fhansen Praktikant
04. april 2007 - 14:46 #10
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.


GOD PÅSKE
Avatar billede hrc Mester
05. april 2007 - 23:05 #11
Jeg ville ikke kunne lave en Groub By uden at have en Count med. Troede egentlig også at det var de værdier du gerne ville have med.
Avatar billede fhansen Praktikant
07. april 2007 - 00:17 #12
Jeg fik ikke dit forslag til virke for mig, men har fået det til at køre ved at bruge union, det giver en noget langsom eksekvering.

finn
Avatar billede fhansen Praktikant
07. april 2007 - 01:26 #13
Hmmm Så fik jeg da et nyt problem, men det skal jeg vel starte i et nyt spørgsmål, da det sikkert ikke direkte hænger sammen med dette.

Min clientDataSet laver fejl ved applyupdates.
Avatar billede fhansen Praktikant
10. april 2007 - 01:05 #14
Lig lige et svar...*SS*
Avatar billede hrc Mester
10. april 2007 - 09:27 #15
Et svar.
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
Kurser inden for grundlæggende programmering

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