Avatar billede Larsbj1988 Nybegynder
27. maj 2010 - 13:56 Der er 7 kommentarer

Lave et join på 3 tabeller

Jeg har 3 tabeller. En kundetabel(Fk_Personnr,land), en person tabel(personnr,navn, postnr)  og en telefontabel(fk_personnr, telefon).

Det er lavet sådan at en kunde kan have 1-2 telefonnumre. Nogen der kan fortælle hvordan jeg kan få lavet et select der vil give mig en oversigt over kunder:
Personnr, navn, postnr, land, telefon, telefon 2 ?? hvor der så bare kan stå null i telefon 2 hvis de kun har et.
Håber nogen kan hjælpe. kan kun få lavet det sådan at jeg får:
Personnr, navn, postnr, land, telefon

og hvis de så har flere telefonnumre så kommer der bare en linje magen til hvor telefon så bare bliver telefon2.

det har jeg gjort med følgende statement:
SELECT person.*, land, telefon
FROM person, kunde, telefon
WHERE person.personnr = kunde.personnr and person.personnr= telefon.personnr
Avatar billede Syska Mester
27. maj 2010 - 14:08 #1
Dvs du vil kun have 1 row selvom der er 2 telefonnumre ?
Avatar billede Larsbj1988 Nybegynder
27. maj 2010 - 14:12 #2
Ja, det var det jeg tænkte? Altså det er fordi jeg skal kunne indlæse hver kunde i et kundeobjekt i C#, og deri har hver kunde mulighed for at have 2 telefonnumre, og hvis så de kun har et, så er telefon2 bare = 0 :)
Avatar billede Syska Mester
27. maj 2010 - 14:25 #3
Dette er ikke databasens opgave og kan ikke gøres på nogen pæn måde. Jeg ville pakke det ned i dit business lag.
Avatar billede HenrikSjang Nybegynder
27. maj 2010 - 20:58 #4
Det her skulle kunne gøre det (ret selv lige tabelnavne og kolonne navne til så det passer til dit:

create table Kunder (
    Personnr int,
    land varchar(10)
)

create table Person (
    Personnr int,
    Navn varchar(20),
    Postnr int
)

create table Telefon (
    Personnr int,
    Telefon varchar(10)
)


;with cte
as
(
select
    row_number() over(partition by Personnr order by personnr) as rn,
    Personnr,
    telefon
from
    telefon
)
select   
    t1.*,
    land,
    t3.telefon as Telefon1,
    t4.telefon as Telefon2
from
    Person t1
    inner join kunder t2 on t1.Personnr = t2.personnr
    left outer join cte t3 on t2.personnr = t3.personnr and t3.rn = 1
    left outer join cte t4 on t2.personnr = t4.personnr and t4.rn = 2
Avatar billede Syska Mester
27. maj 2010 - 23:26 #5
LOL, faktisk ik' helt dumt tænkt ...

Men ikke et design jeg ville gå efter ... men snedig måde :-)
Avatar billede janus_007 Nybegynder
28. maj 2010 - 02:32 #6
Ja sql'en er nu smart nok og du har fået hvad du spurgte efter, men anvendelsen er forkert. Hvad nu hvis der pludselig af sære årsager var 3 numre? eller en anden "snedig" udvikler brugte samme metode på måske en type som uden videre kunne gå fra 2 til mange? eks.vis.. hmm... kontaktpersoner i en boldklub, eller måske punkter på en linje? well.. min pointe er bare at begynder man først at forurene koden kan det gå grueligt galt i fremtiden. Ever heard about Broken Windows?

Den slags skal gøres i BL eller præsentation.

Brug Linq så har du slet ikke de problemer der :)

NB: Det er ikke uden grund at ham der lavede db-designet normaliserede telefonnummeret :) det betyder alt fra 0 til mange og ikke 1 eller 2 ;) Hvis du insisterer på 1 eller 2 og det er dig som er designer, så denormaliser og læg dine telefonnumrer i persontabellen med telefon1 og telefon2, så kan alle se dine klare intentioner ;)
Avatar billede HenrikSjang Nybegynder
28. maj 2010 - 08:44 #7
Jeg er helt enig med buzzz og janus_007, at det ikke just er en pæn måde at gøre det på, og janus_007's betragtninger om potentiel udvidelse til >2 telefonnumre, gør at det er en rigtig dårlig løsning.
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