While I don't always use it, if there's a chance of data missing I'll use (+) and test for null on the key field using ISNULL() in the program. NULLS are hard to see when running the query interactively, so I'd then use the NVL function:
NVL(p1,p2) = if p1 is null then return p2 else return p1
select t.*,\n nvl(u1.FIRSTNAME, 'data missing') AT_FIRSTNAME,\n nvl(u2.FIRSTNAME, 'data missing') OB_FIRSTNAME,\n nvl(u3.FIRSTNAME, 'data missing') RB_FIRSTNAME\n from tickets t,\n users u1,\n users u2,\n users u3\n where t.ASSIGNEDTO = u1.USERID (+)\n and t.OPENEDBY = u2.USERID (+)\n and t.REQUESTEDBY = u3.USERID (+)
I found that using (+) is a quick(performance) way to get a list of what's not in the other file. To see all tickets with an invalid ASSIGNEDTO value, I'd use this:
select t.*,\n from tickets t,\n users u1\n where t.ASSIGNEDTO = u1.USERID (+)\n and u1.USERID is null\n