Credo che tu possa pensare a questo come a un problema di precedenza dell'operatore.
Quando scrivi questo:
FROM groups grp,
insrel archiverel
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
Penso che sia interpretato dal parser in questo modo:
FROM groups grp,
(
(
insrel archiverel
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
)
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
)
In tal caso, nel join più interno "grp" non è associato.
Quando inverti le linee con "groups" e "insrel", il join più interno si applica a "groups" e "ownrel", quindi funziona.
Probabilmente funzionerebbe anche questo:
FROM groups grp
JOIN insrel archiverel ON archiverel.dnumber = grp.number
LEFT OUTER JOIN ownrel ownrel ON grp.number = ownrel.dnumber
LEFT OUTER JOIN tags tags ON tags.number = ownrel.snumber
WHERE archiverel.snumber = 11128188