Avatar billede hojgaard Nybegynder
25. september 2002 - 10:41 Der er 10 kommentarer og
1 løsning

SELECT problem

Jeg har prøvet at lave en miniudgave af mit problem:

I MySQL har jeg 2 tabeller:

Person { id, exid, navn, adresse, telefon }
ExternPerson { exid, adresse }

Hvis der ikke er angivet et nummer i exid i tabellen Person, skal den hente adresse fra Person.
Hvis der er angivet et nummer i exid i tabellen Person, skal den hente adresse fra ExternPerson.

Hvordan kan det laves uden at der laves om på designet?
Avatar billede lauer Nybegynder
25. september 2002 - 10:52 #1
Jeg tror ikke du kan lave det i en selection i mysql
Du er nødt til at tjekke det før, og så derefter lave en SQL sætning alt efter hvad den forgående resultat bliver

lauer
Avatar billede proaccess Nybegynder
25. september 2002 - 11:08 #2
SELECT p.id, p.exid, IFNULL(e.adresse, p.adresse) adresse, p.telefon FROM Person p LEFT JOIN ExternPerson e ON p.exid=e.exid;
Avatar billede proaccess Nybegynder
25. september 2002 - 12:49 #3
>hojgaard: kom du videre med dette...?
Avatar billede hojgaard Nybegynder
25. september 2002 - 12:54 #4
proacces:
Jeg arbejder lige nu på at få det til at virke.
Umiddelbart ser det ud til at være det helt rigtige du kom med. Jeg har bare problemer med at få en WHERE lagt ind i statementet...
Avatar billede proaccess Nybegynder
25. september 2002 - 13:06 #5
Hvis du kom med en mere præcis beskrivelse af dine "rigtige" tabeller og det ønskede resultat, så kunne du måske få en hjælpende hånd...
Avatar billede hojgaard Nybegynder
25. september 2002 - 13:22 #6
Det ville ikke være helt dårligt proaccess :-)

Her kommer de:
Employee:
---------
employeeid, jobtitle, firstname, lastname, address1, address2, zipcode, city, countryid, phone, mobile, fax, email, birthday, hiredsince, sex, nativelanguage, otherlanguage, region, careeraspiration, cv, employeeno, beocademyno, cardno, cardstatus, active, salesperson, technician, skillsinaudio, skillsinvideo, skillsininstallation, trainer, shopowner, leader, internalemployee, username, password, access, shopid

employeeid er primærnøgle
countryid er fremmednølge
beocademyno er fremmednølge
shopid er fremmednølge


ExternEmployee:
---------------
beocademyno, jobtitle, firstname, lastname, address1, address2, zipcode, city, country, state, cardno, cardstatus, active, phone, mobile, fax, email, birthday, sex, nativelanguage, otherlanguage, region

beocademyno er primærnøgle


Grunden til den mærkelige opbygning, er at ExternEmployee er en tabel der bliver opdateret "udefra" hver nat. Derfor har jeg ingen mulighed for selv at opdatere i disse oplysninger. Employee er "min egen" tabel hvor der kan oprettes medarbejdere. Når en medarbejder i "min egen" tabel får angivet et beocademyno, skal den hente nogle af oplysningerne fra Employee og nogle fra ExternEmployee. Ellers skal den kun hente fra Employee.


Når der er angivet beocademyno skal den hente:

Fra Employee:
-------------
employeeid, hiredsince, careeraspiration, cv, employeeno, cardno, cardstatus, active, salesperson, technician, skillsinaudio, skillsinvideo, skillsininstallation, trainer, shopowner, leader, internalemployee, username, password, access, shopid

Fra ExternEmployee:
-------------------
skal den hente det hele.



Håber det er forståligt :-)
Avatar billede proaccess Nybegynder
25. september 2002 - 13:55 #7
Det var ellers lidt af en smøre...

Dit udgangspunkt må være at binde de 2 tabeller sammen ved et LEFT JOIN på beocademyno og så se om der er nogen externe oplysninger i ExternEmployee... vha. ISNULL()

SELECT p.employeeid,
IFNULL(e.jobtitle, p.jobtitle) jobtitle,
IFNULL(e.firstname, p.firstname) firstname,
IFNULL(e.lastname, p.lastname) lastname,
IFNULL(e.address1, p.address1) address1,
IFNULL(e.address2, p.address2) address2,
IFNULL(e.zipcode, p.zipcode) zipcode,
IFNULL(e.city, p.city) city,
IFNULL(e.countryid, p.countryid) countryid,
e.state,
IFNULL(e.phone, p.phone) phone,
IFNULL(e.mobile, p.mobile) mobile,
IFNULL(e.fax, p.fax) fax,
IFNULL(e.email, p.email) email,
IFNULL(e.birthday, p.birthday) birthday,
p.hiredsince,
IFNULL(e.sex, p.sex) sex,
IFNULL(e.nativelanguage, p.nativelanguage) nativelanguage,
IFNULL(e.otherlanguage, p.otherlanguage) otherlanguage,
IFNULL(e.region, p.region) region,
p.careeraspiration,
p.cv,
p.employeeno,
p.beocademyno,
IFNULL(e.cardno, p.cardno) cardno,
IFNULL(e.cardstatus, p.cardstatus) cardstatus,
IFNULL(e.active, p.active) active,
p.salesperson,
p.technician,
p.skillsinaudio,
p.skillsinvideo,
p.skillsininstallation,
p.trainer,
p.shopowner,
p.leader,
p.internalemployee,
p.username,
p.password,
p.access,
p.shopid
FROM Employee p LEFT JOIN ExternEmployee e ON p.beocademyno=e.beocademyno;
Avatar billede hojgaard Nybegynder
25. september 2002 - 14:06 #8
1000 tak for hjælpen proaccess. Det virker bare helt perfekt!
Du har virkelig været en stor hjælp!!!
Avatar billede proaccess Nybegynder
25. september 2002 - 14:13 #9
Det var da så lidt...  ;0)

Bemærk at jeg ikke tager hensyn til NULL-værdier i enkelte felter i min løsning...

Det vil sige at hvis medarbejder xx er med i ExternEmployee men at Address1-feltet er tomt (NULL), så er det DIN oprindelige værdi, som bruges.
Avatar billede hojgaard Nybegynder
25. september 2002 - 14:30 #10
hmm... der er vel ikke en måde hvorpå jeg kan sikre mig at den alligevel henter null-værdien i ExternEmployee?
Avatar billede proaccess Nybegynder
25. september 2002 - 14:36 #11
Du kan bruge IF i stedet for IFNULL... og så lave tjekket på e.beocademyno...

SELECT p.employeeid,
IF(e.beocademyno Is Not Null, e.jobtitle, p.jobtitle) jobtitle,
IF(e.beocademyno Is Not Null, e.firstname, p.firstname) firstname,
IF(e.beocademyno Is Not Null, e.lastname, p.lastname) lastname,
IF(e.beocademyno Is Not Null, e.address1, p.address1) address1,
IF(e.beocademyno Is Not Null, e.address2, p.address2) address2,
IF(e.beocademyno Is Not Null, e.zipcode, p.zipcode) zipcode,
IF(e.beocademyno Is Not Null, e.city, p.city) city,
IF(e.beocademyno Is Not Null, e.countryid, p.countryid) countryid,
e.state,
IF(e.beocademyno Is Not Null, e.phone, p.phone) phone,
IF(e.beocademyno Is Not Null, e.mobile, p.mobile) mobile,
IF(e.beocademyno Is Not Null, e.fax, p.fax) fax,
IF(e.beocademyno Is Not Null, e.email, p.email) email,
IF(e.beocademyno Is Not Null, e.birthday, p.birthday) birthday,
p.hiredsince,
IF(e.beocademyno Is Not Null, e.sex, p.sex) sex,
IF(e.beocademyno Is Not Null, e.nativelanguage, p.nativelanguage) nativelanguage,
IF(e.beocademyno Is Not Null, e.otherlanguage, p.otherlanguage) otherlanguage,
IF(e.beocademyno Is Not Null, e.region, p.region) region,
p.careeraspiration,
p.cv,
p.employeeno,
p.beocademyno,
IF(e.beocademyno Is Not Null, e.cardno, p.cardno) cardno,
IF(e.beocademyno Is Not Null, e.cardstatus, p.cardstatus) cardstatus,
IF(e.beocademyno Is Not Null, e.active, p.active) active,
p.salesperson,
p.technician,
p.skillsinaudio,
p.skillsinvideo,
p.skillsininstallation,
p.trainer,
p.shopowner,
p.leader,
p.internalemployee,
p.username,
p.password,
p.access,
p.shopid
FROM Employee p LEFT JOIN ExternEmployee e ON p.beocademyno=e.beocademyno;
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