MySQL outer join

Tags:    databaser

I en oracle database er det muligt at bruge (+), parantes-komma-parantes, når resultatet af en join godt må indeholde værdier, der ikke opfylder kriteriet i where klausulen

Nedenstående eksempel viser afdelinger, der har ansatte:

SELECT persnr, navn, afdnavn
FROM afdelinger, ansatte
WHERE afdelinger.afdnr = ansatte.afdnr

Hvis man ønsker at få vist alle afdelinger, hvad enten de har medarbejdere eller ej, kan man angive dette på følgende måde:

SELECT persnr, navn, afdnavn
FROM afdelinger, ansatte
WHERE afdelinger.afdnr = ansatte.afdnr (+)

Det er ikke muligt at benytte (+) syntaxen i MySQL, så hvordan kan det lade sig gøre? Kan det lade sig gøre overhovedet?

På forhånd tak!

Carsten



6 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Du skriver:

Hvis man ønsker at få vist alle afdelinger, hvad enten de har medarbejdere eller ej, kan man angive dette på følgende måde:

SELECT persnr, navn, afdnavn
FROM afdelinger, ansatte
WHERE afdelinger.afdnr = ansatte.afdnr (+)

Så kan du jo vel bare sige:

SELECT afdnavn
FROM afdelinger

Med mindre jeg har misforstået dit spørgsmål?!

/Daniel
C# the new dimension...



OK... så er der bare tale om en OUTER JOIN

SELECT persnr, navn, afdnavn
FROM afdelinger LEFT OUTER JOIN ansatte ON (afdelinger.afdnr = ansatte.afdnr)

Vil du også have alle medarbejdere som ikke er ansat i en afdeling skal du bare erstatte LEFT med FULL.



Hej Daniel,

jo, det kunne jeg godt, men så får jeg ikke persnr og navn med i resultatet. Derfor bliver jeg nød til at lave en JOIN. Resultatet skal vise persnr, navn og afdnavn

Men, jeg vil ikke kun have et resultat, der indeholder ansatte, som har et afdnr i afdelinger tabellen. Resultatet skal også vise de afdelinger der ikke har medarbejdere.

Eksempelvis vis afdelinger tabellen indeholder en række, der har værdien 40 i afdnr kolonnen, og der ikke findes en ansat i ansatte tabellen med det afdnr, så skal rækken alligevel vises men med NULL i persnr og NULL i navn.


Håber det forklarer lidt mere

Carsten



Ja det forklarer det noget mere præcist ;)

/Daniel
C# the new dimension...



OK... så er der bare tale om en OUTER JOIN

SELECT persnr, navn, afdnavn
FROM afdelinger LEFT OUTER JOIN ansatte ON (afdelinger.afdnr = ansatte.afdnr)

Vil du også have alle medarbejdere som ikke er ansat i en afdeling skal du bare erstatte LEFT med FULL.


Hej Erik,

det har jeg prøvet, og jeg får følgende fejl:

You have an error in your SQL syntax near 'OUTER JOIN ansatte ON (afdelinger.afdnr = ansatte.afdnr)

Det virker som om, den ikke kan fortolke FULL OUTER JOIN, men jeg ville mene, det er en standard SQL syntax for joins, som selv MySQL burde kunne fortolke.

Min udbyder kører med MySQL 3.23.47. Jeg ved ikke det kan have noget med det at gøre, men jeg tvivler...

Carsten



Prøv:

SELECT ansatte.persnr, ansatte.navn, afdelinger.afdnavn
FROM afdelinger LEFT JOIN ansatte ON afdelinger.afdnr = ansatte.afdnr


Ellers må du lige kontrollere navnene på tabellerne og kolonnerne



t