SQL left join met voorwaarde op rechter tabel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

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.

Afbeeldingslocatie: http://i54.tinypic.com/10omtxl.png

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?

Acties:
  • 0 Henk 'm!

  • Stuupje
  • Registratie: Februari 2011
  • Laatst online: 25-04 19:47
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;

Acties:
  • 0 Henk 'm!

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 ]


Acties:
  • 0 Henk 'm!

  • 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.

Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 10-05 22:28
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;

Acties:
  • 0 Henk 'm!

  • 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 ]


Acties:
  • 0 Henk 'm!

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

{signature}


Acties:
  • 0 Henk 'm!

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')


Afbeeldingslocatie: http://i56.tinypic.com/ae0fnt.png

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.

Acties:
  • 0 Henk 'm!

  • 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}


Acties:
  • 0 Henk 'm!

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.

Acties:
  • 0 Henk 'm!

  • Bonsaiboom
  • Registratie: December 2009
  • Laatst online: 13-03 15:07
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