[SQL] JOIN met "ongekoppelde" records

Pagina: 1
Acties:

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Hello,

De volgende tabellen zijn gegeven:
SQL:
1
2
SELECT id, titel AS artikel
FROM artikel

idartikel
1Banaan
2Appel
3Bloemkool
4Prei
5Gehaktbal
6Koffie

SQL:
1
2
SELECT id, titel AS categorie
FROM categorie

idcategorie
1Groente
2Fruit
3Vlees

SQL:
1
2
SELECT *
FROM artikel_categorie

artikel_idcategorie_id
12
22
31
41


Ik kan links en rechts vanalles aan elkaar joinen, maar is er nu een query waarmee in één keer de volgende resultset kan verkrijgen? Oftewel: ook de artikelen en de categorieën die niet gekoppeld zijn worden weergeven.

artikelcategorie
BanaanFruit
AppelFruit
BloemkoolGroente
PreiGroente
GehaktbalNULL
KoffieNULL
NULLVlees

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Volgens mij heet zoiets een full outer join. Geen idee met wat voor DB je werkt, dus ook niet of het dan ondersteund wordt.

Noushka's Magnificent Dream | Unity


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Klopt: P&W FAQ - SQL

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Ik gebruik MySQL 4.0.24, waarin dat dus niet kan. Dom dat ik niet vermeld heb zojuist. Maar die schijnt dus geen FULL OUTER JOIN te ondersteunen. Ik zoek nog even verder, maar ben uiteraard zeer geïnteresseerd in oplossingen!

[ Voor 5% gewijzigd door X-Lars op 13-01-2006 16:32 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ok, even improviseren :P
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
  a.titel AS artikel_titel,
  c.titel AS categorie_titel
FROM
  artikel a
  LEFT JOIN artikel_categorie ac ON a.id = ac.artikel_id
  LEFT JOIN categorie c ON ac.categorie_id = c.id
UNION DISTINCT
SELECT
  a.titel AS artikel_titel,
  c.titel AS categorie_titel
FROM
  categorie c
  LEFT JOIN artikel_categorie ac ON c.id = ac.categorie_id
  LEFT JOIN artikel a ON ac.artikel_id = a.id

Geen idee of dat werkt, ook niet of die join helemaal goed werkt zo. Mischien kan iemand me daar op corrigeren?
edit:

Code gewijzigd en getest. Dit werkt iig.

[ Voor 14% gewijzigd door Michali op 14-01-2006 13:09 ]

Noushka's Magnificent Dream | Unity


  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Klopt, bedankt :)

Ik had nog niet eerder met dat UNION gewerkt, maar dat is me nu wel duidelijk geloof ik. Volgens mij is dit nog wat efficiënter:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
  a.titel AS artikel_titel,
  c.titel AS categorie_titel
FROM
  artikel a
  LEFT JOIN artikel_categorie ac ON a.id = ac.artikel_id
  LEFT JOIN categorie c ON ac.categorie_id = c.id
UNION DISTINCT
SELECT
  a.titel AS artikel_titel,
  c.titel AS categorie_titel
FROM
  categorie c
  LEFT JOIN artikel_categorie ac ON c.id = ac.categorie_id
  LEFT JOIN artikel a ON ac.artikel_id = a.id
WHERE a.id IS NULL

Die WHERE-clause is volgens mij wel "veilig", omdat ik alle a.id's die niet NULL zijn al in de eerste SELECT meeneem.
Pagina: 1