Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] Select met relaties levert niet gewenste resultaat.

Pagina: 1
Acties:

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 11:29
Ik heb 3 tabellen (er zijn er wel meer, maar denk niet dat het relevant is voor mijn vraag):
Calls, Produkt en SubProdukt.
In de tabel Calls heb ik onder andere de kolom produkt_idfk en subprodukt_idfk en zoals jullie wellicht raden zijn dit id's naar de tabellen produkt en subprodukt.
Werkt prima, gaat helemaal goed.
Maar.....

Subprodukt is niet verplicht.
Dus bij een insert in de tabel calls komt er NULL te staan als waarde.
Voorbeeld:
Call IDProdukt_idfkSubProdukt_idfk
12255
222NULL

Bij Call ID 2 is er geen sub produkt ingevoerd.
Hier kan ik prima mee leven.

Echter wanneer ik een select query, met een join naar de subprodukt tabel (om er de naam uit te halen i.p.v. het id te tonen) uitvoer, dan krijg ik netjes alle rijen te zien, behalve die waarvan het subprodukt NULL is.

Ik heb al zitten zoeken, maar kan hier niet een oplossing voor vinden.

Iemand een idee ?
Ik vermoed (maar kan het niet vinden) dat er een extra parameter moet worden meegegeven om toch die NULL te tonen, maar ja..... welke ?

The best thing about UDP jokes is that I don't care if you get them or not.


  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 19:50
zonder query wordt het wat moeilijk. Ik gok dat je een INNER JOIN gebruikt. eneigenlijk LEFT JOIN wilt hebben.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lees even onze FAQ: Hoe werken joins? ;)

[ Voor 4% gewijzigd door RobIII op 15-11-2007 16:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 11:29
rutgerw schreef op donderdag 15 november 2007 @ 16:33:
zonder query wordt het wat moeilijk. Ik gok dat je een INNER JOIN gebruikt. eneigenlijk LEFT JOIN wilt hebben.
Inderdaad. Ik ga daar morgen eens naar kijken.
Ik begrijp dat het zonder query moeilijk te bepalen is. Maar ik kreeg het vermoeden dat dit een "standaard" vraagje moest zijn.
Maar het antwoord kon ik niet vinden.

Voor de liefhebber:
SELECT t_calls.call_id, t_calls.call_onderwerp, t_calls.call_text, t_calls.call_nummer_leverancier, t_calls.call_alert, t_calls.call_alert_datum, t_calls.call_actief, t_invoerders.invoerder_voornaam, t_invoerders.invoerder_achternaam, t_status.status_naam, t_bedrijven.bedrijf_naam, t_personen.persoon_naam, t_produkten.produkt_naam, t_subprodukten.subprodukt_naam, t_communicatie.communicatie_naam, t_databases.database_naam FROM t_calls INNER JOIN t_invoerders ON t_calls.call_invoerder_idfk = t_invoerders.invoerder_id INNER JOIN t_status ON t_calls.call_status_idfk = t_status.status_id INNER JOIN t_bedrijven ON t_calls.call_bedrijf_idfk = t_bedrijven.bedrijf_id AND t_calls.call_bedrijf_idfk = t_bedrijven.bedrijf_id INNER JOIN t_personen ON t_calls.call_persoon_idfk = t_personen.persoon_id AND t_bedrijven.bedrijf_id = t_personen.persoon_bedrijf_idfk INNER JOIN t_produkten ON t_calls.call_produkt_idfk = t_produkten.produkt_id AND t_calls.call_produkt_idfk = t_produkten.produkt_id AND t_bedrijven.bedrijf_id = t_produkten.produkt_bedrijf_idfk INNER JOIN t_subprodukten ON t_calls.call_subprodukt_idfk = t_subprodukten.subprodukt_id AND t_produkten.produkt_id = t_subprodukten.subprodukt_produkt_idfk INNER JOIN t_databases ON t_calls.call_database_idfk = t_databases.database_id AND t_status.status_database_idfk = t_databases.database_id AND t_bedrijven.bedrijf_database_idfk = t_databases.database_id AND t_personen.persoon_database_idfk = t_databases.database_id AND t_produkten.produkt_database_idfk = t_databases.database_id AND t_subprodukten.subprodukt_database_idfk = t_databases.database_id INNER JOIN t_communicatie ON t_calls.call_communicatie_idfk = t_communicatie.communicatie_id AND t_databases.database_id = t_communicatie.communicatie_database_idfk WHERE (t_calls.call_database_idfk = @SelectedDatabaseId) AND (t_calls.call_actief = 'True') ORDER BY t_calls.call_datum

The best thing about UDP jokes is that I don't care if you get them or not.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

Daar staat dus inderdaad INNER JOIN. Als je even opzoekt wat een INNER join doet, snap je ook waarom je sommige records niet terugkrijgt.

Om e.e.a. wat leesbaarder te maken kun je trouwens aliases gebruiken, en code tags, en dan de zooi nog een beetje uitlijnen - voor je het weet kunnen we je query echt lezen ;)

Wat betekent mijn avatar?


  • Sepio
  • Registratie: Oktober 2007
  • Laatst online: 13:04
Voor elk veld dat in de t_call tabel NULL kan zijn gebruik je een LEFT JOIN.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
SELECT 
    a.call_id
    , a.call_onderwerp
    , a.call_text
    , a.call_nummer_leverancier
    , a.call_alert
    , a.call_alert_datum
    , a.call_actief
    , i.invoerder_voornaam
    , i.invoerder_achternaam
    , b.status_naam
    , c.bedrijf_naam
    , d.persoon_naam
    , e.produkt_naam
    , f.subprodukt_naam
    , h.communicatie_naam
    , g.database_naam 
 FROM t_calls a
 LEFT JOIN t_invoerders i
 ON a.call_invoerder_idfk = i.invoerder_id 
 LEFT JOIN t_status b
 ON a.call_status_idfk = b.status_id 
 LEFT JOIN t_bedrijven c
 ON a.call_bedrijf_idfk = c.bedrijf_id 
 AND a.call_bedrijf_idfk = c.bedrijf_id 
 LEFT JOIN t_personen d
 ON a.call_persoon_idfk = d.persoon_id 
 AND c.bedrijf_id = d.persoon_bedrijf_idfk 
 LEFT JOIN t_produkten e
 ON a.call_produkt_idfk = e.produkt_id 
 AND a.call_produkt_idfk = e.produkt_id 
 AND c.bedrijf_id = e.produkt_bedrijf_idfk 
 LEFT JOIN t_subprodukten f
 ON a.call_subprodukt_idfk = f.subprodukt_id 
 AND e.produkt_id = f.subprodukt_produkt_idfk 
 LEFT JOIN t_databases g
 ON a.call_database_idfk = g.database_id 
 AND b.status_database_idfk = g.database_id 
 AND c.bedrijf_database_idfk = g.database_id 
 AND d.persoon_database_idfk = g.database_id 
 AND e.produkt_database_idfk = g.database_id 
 AND f.subprodukt_database_idfk = g.database_id 
 LEFT JOIN t_communicatie h
 ON a.call_communicatie_idfk = h.communicatie_id 
 AND g.database_id = h.communicatie_database_idfk 
 WHERE (
    a.call_database_idfk = @SelectedDatabaseId
 ) 
 AND (
    a.call_actief = 'True'
 ) ORDER BY a.call_datum

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 11:29
Dido schreef op donderdag 15 november 2007 @ 18:59:
Daar staat dus inderdaad INNER JOIN. Als je even opzoekt wat een INNER join doet, snap je ook waarom je sommige records niet terugkrijgt.

Om e.e.a. wat leesbaarder te maken kun je trouwens aliases gebruiken, en code tags, en dan de zooi nog een beetje uitlijnen - voor je het weet kunnen we je query echt lezen ;)
Dat was hem. Left join.
Nooooooit gedacht dat het daar aan kon liggen. Weer wat geleerd.

Ik gebruik dan ook de manager van sql (microsoft) om mijn relaties te maken.
Vandaar ook niet het gebruik van aliases etc...

Code tags had ik gebruikt, maar mijn string heeft geen CR erin zitten.
Toen heb ik handmatig de boel uitgelijnd, en toen kwam het helemaal niet meer goed.....
Dus dacht ik, gooi hem in een quote.

edit:

Sepio heeft meer geduld.....

[ Voor 2% gewijzigd door Remco op 16-11-2007 14:57 . Reden: Sepio heeft meer geduld..... ]

The best thing about UDP jokes is that I don't care if you get them or not.

Pagina: 1