Er zijn een aantal varianten denkbaar, maar allemaal vrij complex. Sowieso wil je geen left join als ik je goed begrijp maar een gewone inner join op one.id OF op 0, maar die 0 bestaat per definitie wel.
Puur voor de query-complexiteit kan je beter je 0-record los ophalen en die gebruiken in je php-code.
Deze is mogelijk denk ik, maar zal waarschijnlijk niet zo efficient indexen gebruiken:
code:
1
2
3
4
5
6
7
| SELECT * FROM table1 one
JOIN table2 two ON
CASE WHEN EXISTS
(SELECT * FROM table2 two_i WHERE two_i.id = one.id)
THEN one.id = two.id
ELSE two.id = 0
END |
Of
code:
1
2
3
| SELECT * FROM table1 one
JOIN table2 two ON
COALESCE((SELECT id FROM table2 two_i WHERE two_i.id = one.id), 0) = two.id |
Je kan ook vrij vies de tweede tabel standaard een extra keer meejoinen:
code:
1
2
3
4
| SELECT *, COALESCE(two.id, two_bck.id) as id, ...
FROM table1 one
LEFT JOIN table2 two ON one.id = two.id
JOIN (SELECT * FROM table2 WHERE id = 0) as two_bck |
Of eerst kijken of er wel een id is in tabel 2:
code:
1
2
3
4
5
6
| SELECT one.*, two.*
FROM table1 one
JOIN
(SELECT one_t.id, COALESCE(two_t.id, 0) as searchid
FROM table1 one_t LEFT JOIN table2 two_t USING(id)) as test
JOIN table2 two ON two.id = test.searchid |
En de having-variant van Edwardvb is ook mogelijk. Waarschijnlijk kan je ook nog iets doen met iets als ">= ALL" voor de id's.
[
Voor 4% gewijzigd door
ACM op 18-09-2007 10:33
]