Toon posts:

SQL left join met voorwaarde op rechter tabel

Pagina: 1
Acties:

Onderwerpen


Anoniem: 42791

Topicstarter
Hoi,

Ik heb de volgende tabellen. Ik wil alle rijen uit de linkertabel pakken als
- ze geen matchend record in de rechtertabel hebben
- ze wel een matchend record in de rechtertabel hebben EN voor dit record geldt dat field1 = field2.



Ik had eigenlijk gehoopt dat dit zou werken, maar helaas.
code:
1
2
SELECT *  FROM test1 t1 LEFT JOIN test2 t2 ON t1.test1_id = t2.test1_id 
where t2.field1 = t2.field2;


Dit levert alle records uit t1 op met een matchend record uit t2 waarvoor geldt dat field1 = field2, maar geen records uit t1 die geen matchend record in t2 hebben.

Wie weet er hoe dit moet?

  • Stuupje
  • Registratie: Februari 2011
  • Laatst online: 27-05 00:45
Volgens mij kan dit gedaan worden met een OUTER JOIN.

code:
1
2
3
4
5
SELECT *  
FROM test1 as t1
LEFT OUTER JOIN test2 as t2
ON t1.test1_id = t2.test1_id 
WHERE t2.field1 = t2.field2;

Anoniem: 42791

Topicstarter
Heck, ik heb al een oplossing met subqueries, maar misschien kan het op meerdere manieren :)

code:
1
2
3
4
SELECT * FROM test1 t1  
    WHERE 
        (test1_id IN (SELECT test1_id FROM test2 t2 WHERE t2.field1 = t2.field2)) 
    OR  (test1_id NOT IN (SELECT test1_id FROM test2 t2));


Ik ga even testen Stuupje.

/ Volgens mij is er geen verschil tussen LEFT JOIN en LEFT OUTER JOIN. Ik krijg in elk geval dezelfde resultaten terug.

[Voor 16% gewijzigd door Anoniem: 42791 op 10-06-2011 01:43]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Het probleem is dat je t2.field1 en t2.field2 beide null zijn in het geval t2 geen resultaat geeft. En null = null is helaas false. (zie hier waarom: http://stackoverflow.com/...olumn-null-return-no-rows)
Wat je dus moet doen is de where uitbreiden tot ie er zo uitziet:
SQL:
1
2
WHERE t2.field1 = t2.field2
   OR (t2.field1 Is Null And t2.field2 Is Null)

Mocht het data-technisch onmogelijk zijn dat t2.field1 een null bevat (bijvoorbeeld omdat de kolomdefinitie dat niet toestaat), dan is de check op field1 voldoende.

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 18:03
Gewoon de extra conditie in de join clausule zetten:

SQL:
1
2
3
SELECT *  
FROM test1 t1 
LEFT JOIN test2 t2 ON t1.test1_id = t2.test1_id AND t2.field1 = t2.field2;

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Stuupje schreef op vrijdag 10 juni 2011 @ 01:35:
Volgens mij kan dit gedaan worden met een OUTER JOIN.

code:
1
2
3
4
5
SELECT *  
FROM test1 as t1
LEFT OUTER JOIN test2 as t2
ON t1.test1_id = t2.test1_id 
WHERE t2.field1 = t2.field2;
LEFT JOIN en LEFT OUTER JOIN is precies hetzelfde. Je bedoelt denk ik een FULL JOIN of FULL OUTER JOIN.

Edit: Dit is overigens geen oplossing voor het genoemde probleem.

[Voor 7% gewijzigd door Remus op 10-06-2011 13:19]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Klopt, want DamadmOO geeft reeds het beste antwoord. :)

{signature}


Anoniem: 42791

Topicstarter
Ik heb in eerste instantie ook de oplossing van DamadmOO geprobeerd, omdat me die het meest logisch leek en toch werkt-ie niet.

Het gaat in werkelijkheid om Drupal tabellen, maar in feite is de situatie met onderstaande query hetzelfde als in het voorbeeld van de OP.

Met de query hieronder krijg ik ook artikelen terug waarvoor geldt dat b.nid != b.bid. Tenminste, msyql vult NULL in en dus geldt b.nid = b.bid eigenlijk weer wel (?)
code:
1
2
3
SELECT t.nid AS tnid, t.tid AS ttid, b.nid AS bnid, b.bid AS bbid
FROM taxonomy_index t LEFT JOIN book b ON t.nid = b.nid AND b.nid = b.bid
WHERE (tid = '4')




Alle records met de NULL waarden wil ik niet terug hebben. Ze hebben allemaal een tegenhanger in de book tabel waarvoor geldt b.nid != n.bid.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tja, in de startpost wou je zulke records nog wel. :z

Maar goed je weet nu toch wat de ON en WHERE clauses doen, dus pas dat toe. Desnoods probeer je het vanaf de andere kant: Lukt het met 2 losse queries? Is de UNION tussen die 2 de oplossing? Kan je de query versimpelen zodat de UNION weg kan? Etc.

{signature}


Anoniem: 42791

Topicstarter
Voutloos schreef op vrijdag 10 juni 2011 @ 22:37:
Tja, in de startpost wou je zulke records nog wel. :z
Nope ;) Ik moet records hebben die of geen tegenhanger hebben in de rechtertabel, of wel een tegenhanger waarvoor geldt dat die twee velden in de rechtertabel gelijk aan elkaar zijn. Dat is bij het resultaat van DamadmOO's query niet het geval.
Anoniem: 42791 schreef op vrijdag 10 juni 2011 @ 01:26:
Ik heb de volgende tabellen. Ik wil alle rijen uit de linkertabel pakken als
- ze geen matchend record in de rechtertabel hebben
- ze wel een matchend record in de rechtertabel hebben EN voor dit record geldt dat field1 = field2.
Anoniem: 42791 schreef op vrijdag 10 juni 2011 @ 19:25:
Alle records met de NULL waarden wil ik niet terug hebben. Ze hebben allemaal een tegenhanger in de book tabel waarvoor geldt b.nid != n.bid.
De oplossing van bigbeng werkt trouwens ook en die vind ik iets mooier dan de subquery, dus dat wordt hem.

  • Bonsaiboom
  • Registratie: December 2009
  • Laatst online: 23:00
code:
1
2
SELECT *  FROM test1 t1 LEFT JOIN test2 t2 ON t1.test1_id = t2.test1_id 
where t2.field1 = t2.field2 or t2.test1_id is null;


oops nvm, had niet door dat dit topic al zo oud was :)

[Voor 17% gewijzigd door Bonsaiboom op 20-06-2011 11:24]

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee